# nhphuc's templates 1. Simple start code: ```cpp= /** * Author: Nguyen Huu Phuc * - Fan Dang Doan Duc Trung 20 nam - **/ #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define f first #define s second signed main(){ ios::sync_with_stdio(0); cin.tie(0); if (fopen("test.inp", "r")){ freopen("test.inp", "r", stdin); freopen("test.out", "w", stdout); } } // uoc co cm ``` 2. Multitest start code: ```cpp= /** * Author: Nguyen Huu Phuc * - Fan Dang Doan Duc Trung 20 nam - **/ #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define f first #define s second void solve(){ } signed main(){ if (fopen("TEST.inp", "r")){ freopen("TEST.inp", "r", stdin); freopen("TEST.out", "w", stdout); } ios::sync_with_stdio(0); cin.tie(0); int tt; cin >> tt; while (tt--) solve(); } // uoc co cm ``` 3. Hash template ```cpp= // hash template const int listmod[] = { 81576343, 43179113, 41328541, 85003693, 19498169, 33145051, 64018973, 34085083, 63017569, 29469859, 42387601, 58168027, 49709669, 36439723, 20622821, 75275591, 96992843, 73858823, 34106713, 57137147, 63717893, 64778221, 68839153, 12584711, 62176853, 48996947, 67124723, 61760467, 83064101, 45952063 }; const int listbase[] = { 431, 593, 443, 607, 379, 401, 937, 571, 857, 727 }; const int N = 2e5 + 1; const int L = 2; // can up to 6 mt19937_64 rng(static_cast<int>(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count())); int rand(int l, int r) { return uniform_int_distribution<int>(l, r)(rng); } struct hash_st { int p[N][L], h[N][L], rp[N][L], rh[N][L]; int mod[L], base = -1; void init_l (int n, string s){ if (base == -1){ base = listbase[rand(0, 9)]; set<int> st; while (st.size() < L) st.insert(listmod[rand(0, 29)]); int id = 0; for (auto v : st) mod[id] = v, ++id; } for (int i = 0; i < L; ++i) p[0][i] = 1, h[0][i] = 0; for (int i = 1; i <= n; ++i) for (int j = 0; j < L; ++j) p[i][j] = (p[i - 1][j] * base) % mod[j]; for (int i = 1; i <= n; ++i) for (int j = 0; j < L; ++j) h[i][j] = (h[i - 1][j] * base + (int)(s[i - 1]) + 1) % mod[j]; cerr << "base use in init_l:\n" << base << "\n"; cerr << "mod use in init_l:\n"; for (int i = 0; i < L; ++i) cerr << mod[i] << "\n"; } void init_r (int n, string s){ if (base == -1){ base = listbase[rand(0, 9)]; set<int> st; while (st.size() < L) st.insert(listmod[rand(0, 29)]); int id = 0; for (auto v : st) mod[id] = v, ++id; } for (int i = 0; i < L; ++i) rp[n + 1][i] = 1, rh[n + 1][i] = 0; for (int i = n; i >= 1; --i) for (int j = 0; j < L; ++j) rp[i][j] = (rp[i + 1][j] * base) % mod[j]; for (int i = n; i >= 1; --i) for (int j = 0; j < L; ++j) rh[i][j] = (rh[i + 1][j] * base + (int)(s[i - 1]) + 1) % mod[j]; cerr << "base use in init_r:\n" << base << "\n"; cerr << "mod use in init_r:\n"; for (int i = 0; i < L; ++i) cerr << mod[i] << "\n"; } vector<int> get_l (int l, int r){ vector<int> ans(L); for (int i = 0; i < L; ++i) ans[i] = (h[r][i] - h[l - 1][i] * p[r - l + 1][i] + mod[i] * mod[i]) % mod[i]; return ans; } vector<int> get_r (int l, int r){ vector<int> ans(L); for (int i = 0; i < L; ++i) ans[i] = (rh[l][i] - rh[r + 1][i] * p[r - l + 1][i] + mod[i] * mod[i]) % mod[i]; return ans; } bool palindrome (int l, int r){ return get_l(l, r) == get_r(l, r); } }; // end of hash template ``` 4. Z-algo template ```cpp= // z-algo template struct zfunc { vector<int> z; void init (string s){ int n = s.size(); z.resize(n); int l = 0, r = 0; z[0] = n; for (int i = 1; i < n; ++i) if (i > r){ l = r = i; while (r < n && s[r] == s[r - l]) ++r; z[i] = r - i; --r; } else { int k = i - l; if (z[k] < r - i + 1) z[i] = z[k]; else { l = i; while (r < n && s[r] == s[r - l]) ++r; z[i] = r - l; --r; } } return; } int get (int pref, int n){ int cnt = 0; for (int i = 0; (i + pref - 1) < n; ) if (z[i] >= pref) ++cnt, i += pref; else i += 1; return cnt; } }; // end of z-algo template ```