---
# System prepended metadata

title: 模板與輸入輸出

---

## 來由
在較低層級的競賽與檢定的部分情況當中，方便的重要性遠遠大於速度的重要性
所以這裡介紹不同語言的加速模板與輸入輸出來提高解題時的方便性
## C++ 的加速模板
首先讓各位看看我的加速模板長怎樣
```cpp=
#include<bits/stdc++.h>
using namespace std ;
typedef long long LL ;

// 以下若無用到 pair 或類似資料結構，可不寫，開頭
typedef pair<int, int> Pii
#define FF first
#define SS second
// 結束

int main() {
    ios::sync_with_stdio(0), cin.tie(0) ;
    
    return 0 ;
}
```
先介紹最開始的萬用標頭黨(Header file)
```cpp=
#include<bits/stdc++.h>
```
因為在使用不同函式、結構(如:STL等)時，可以透過標頭檔引入
所以這個萬用標頭檔基本上包括了競技程式會用到的東西
不過在較高的(追求速度)競賽時，這個標頭檔反而會變成累贅

---
再來就是 typedef 跟 define
首先要聲明這兩者有差異，使用上不可以混為一談
```cpp=
#define INT int ;
unsigned INT n ;  // ok
```
```cpp=
typedef int INT ;
unsigned INT n ;  // wrong
```
以上是可能會出錯的例子，接下來使用上不同的例子
```cpp=
#define PTR int* ;
unsigned PTR p1, p2 ;  // int *p1, p2 ;
```
```cpp=
typedef int* PTR ;
unsigned PTR p1, p2 ;  // int *p1, *p2 ;
```

總而言之，在使用這兩種簡寫的方式時，要注意會不會出現錯誤
但不用特別去背，平時使用的時候熟悉，考試時別使用自己不熟的方式即可

---
接下來是加速輸出輸入的部分
```cpp=
ios::sync_with_stdio(0), cin.tie(0) ;
```
這兩個東西建議在程式碼寫完並測試為正確後再加入
不建議在很初期的時候就去理解是幹嘛的
如果不想背這兩個東西也可採用 scanf/printf 取代 cin 跟 cout
如果加入這兩個東西則只能使用 cin 跟 cout 不然可能會有錯誤
最後就是如果你平常使用 `endl` 去當作換行的話，請改成 `'\n'`
不然前面的 `cin.tie(0)` 的功用會大打這扣

---
最後是講解常見的輸入方式，大致上需要講解的只會有四種
第一個就是輸入 $T$ 筆測資，那其實就只要用一個 for-loop 或 while-loop 即可
```cpp=
int t ;
cin >> t ;

// 方法一
for (int i=0;i<t;i++) {
    // 程式碼
}

// 方法二
while (t--) {
    // 程式碼
}
```
實作上方法二寫起來比較快，方法一比較不容易寫錯，但要注意如果你最外層用變數 $i,j$
裡面的 for-loop 就不能使用了，所以我通常會寫 $i,j$ 以外的變數

第二個是重複輸入到 $n = 0$，通常用 while-loop 去做
```cpp=
int n ;
while (cin >> n && n != 0) {
    // 程式碼
}

// 可簡化成
while (cin >> n && n) {
    // 程式碼
}
```

第三個是重複輸入直到 EOF，EOF 就是 End of File，中文是檔案結尾，一樣用 while-loop
```cpp=
int n ;
while (cin >> n) { // 讀到 EOF 相當於 false，loop 會停止
    // 程式碼
}
```
要注意的是，在自行輸入測資時，Window 用 Ctrl+Z 表示 EOF，而 Max/Linux 則是用 Ctrl+D

第四種是輸入一整行，因為 cin 遇到空格或換行就會結束，所以輸入一整行要用 getline
```cpp=
string s ;
getline(cin, s) ;
stringstream ss(s);
int x ;
while (ss >> x)
    cout << x << '\n' ;
```
以上的案例就是一整行有未知個整數，一次輸入的情況，stringsteam 可以當成"模擬輸入" 

## Python 的加速模板
```python=
def main() :
    from sys import stdin
    from collections import deque # queue,stack,deque
    n = stdin.readline() # 讀一行 基本與 input 相同
    for i in stdin :
        # 一次輸入到 EOF 或結束 i 為字串    
main()
```

---
```python=
def main() :
    # 程式內容
main()
```
由於 python (考試版本) 在 local 的運算較快
所以多套一個 main() 會快一點點，記得要在 global call

---
```python=
from sys import stdin
n = stdin.readline() # 讀一行 基本與 input 相同
for i in stdin :
    # 輸入到最後或 EOF 一個 i 為一行
```
用 stdin.readline() 取代 input() 速度會更快一點
如果大量使用 print() 也可以先將要輸出的字串整合
然後在最後一次輸出

---
最後是講解常見的輸入方式，大致上需要講解的只會有四種(可自行將 input() 更換 readline())
第一個就是輸入 $T$ 筆測資，那其實就只要用一個 for-loop 或 while-loop 即可
```python=
t = int(input())

# 方法一
for i in range(t) :
    # 程式碼

while (t) :
    t -= 1
    # 程式碼
```
實作上方法一比較常用，但要注意如果你最外層用變數 $i,j$
裡面的 for-loop 就不能使用了，所以我通常會寫 $i,j$ 以外的變數

第二個是重複輸入到 $n = 0$，通常用 while-loop 去做
```python=
while (1) :
    n = int(input())
    if (n == 0) : break
    # 程式碼
```

第三個是重複輸入直到 EOF，EOF 就是 End of File，中文是檔案結尾，前面說過了就不重複
要注意的是，在自行輸入測資時，Window 用 Ctrl+Z 表示 EOF，而 Max/Linux 則是用 Ctrl+D

第四種是輸入一整行未知數量的整數，要用 list+map 或 list comprehension
```python=
# 方法一
L = list(map(int, input().split()))

# 方法二
L = [int(i) for i in input().split()]
```