A
题意:统计字符出现的次数
/* *@author SunLakeWalk */ #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <iomanip> #include <limits.h> #include <sstream> #include <vector> #include <queue> #include <deque> #include <stack> #include <map> #include <unordered_map> #include <unordered_set> #include <set> //#pragma GCC optimize(2) //#pragma GCC optimize(3, "Ofast", "inlin") using namespace std; #define ios ios::sync_with_stdio(false) , cin.tie(0) #define x first #define y second typedef long long LL; typedef unsigned long long ULL; typedef pair<int, int> PII; const int N = 100010, INF = 0x3f3f3f3f, mod = 1e9 + 7, base = 131; const double eps = 1e-6, PI = acos(-1); char c; string s; int ans; void work() { cin >> c; cin >> s; for (int i = 0; i < s.size(); i ++ ) if (s[i] == c) ans ++; cout << ans << endl; } int main() { int T = 1; // cin >> T; while (T -- ) { work(); } return 0; }
B
公式,从n倒序到0
ans = (ans * x + a[i])即可
/* *@author SunLakeWalk */ #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <iomanip> #include <limits.h> #include <sstream> #include <vector> #include <queue> #include <deque> #include <stack> #include <map> #include <unordered_map> #include <unordered_set> #include <set> //#pragma GCC optimize(2) //#pragma GCC optimize(3, "Ofast", "inlin") using namespace std; #define ios ios::sync_with_stdio(false) , cin.tie(0) #define x first #define y second typedef long long LL; typedef unsigned long long ULL; typedef pair<int, int> PII; const int N = 100010, INF = 0x3f3f3f3f, mod = 998244353, base = 131; const double eps = 1e-6, PI = acos(-1); int n, m; LL a[N]; LL ans; void work() { cin >> n; for (int i = 0; i <= n; i ++ ) cin >> a[i]; cin >> m; while (m -- ) { int x; cin >> x; ans = 0; for (int i = n; i >= 0; i -- ) { ans = (ans * x + a[i]) % mod; } cout << ans << ' '; } } int main() { int T = 1; // cin >> T; while (T -- ) { work(); } return 0; }
C
双链表模板
每次向前一个节点的左侧或者右侧插入一个节点
/* *@author SunLakeWalk */ #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <iomanip> #include <limits.h> #include <sstream> #include <vector> #include <queue> #include <deque> #include <stack> #include <map> #include <unordered_map> #include <unordered_set> #include <set> //#pragma GCC optimize(2) //#pragma GCC optimize(3, "Ofast", "inlin") using namespace std; #define ios ios::sync_with_stdio(false) , cin.tie(0) #define x first #define y second typedef long long LL; typedef unsigned long long ULL; typedef pair<int, int> PII; const int N = 1000010, INF = 0x3f3f3f3f, mod = 1e9 + 7, base = 131; const double eps = 1e-6, PI = acos(-1); /* 链表啊 */ char s[N], t[N]; int l[N], r[N], idx; char e[N]; void insert(int k, char c) { e[idx] = c; l[idx] = k, r[idx] = r[k]; l[r[k]] = idx, r[k] = idx; idx ++; } void work() { cin >> s + 1 >> t + 1; int n = strlen(s + 1); r[0] = 1, l[1] = 0; idx = 2; for (int i = 1; i <= n; i ++ ) { if (t[i - 1] == 'L') { insert(l[i], s[i]); } else if (t[i - 1] == 'R'){ insert(i, s[i]); } else { insert(0, s[i]); } } for (int i = r[0]; i != 1; i = r[i] ) cout << e[i]; cout << endl; } int main() { int T = 1; // cin >> T; while (T -- ) { work(); } return 0; }
D
DP
我们将当前数的所有质因子都找出来,然后判断是否有和他有公因子,同时比他大的数。
如果有,就更新答案。
为了让长度尽可能地长,我们让和他有公因的数,取当前合法的最小值。
/* *@author SunLakeWalk */ #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <iomanip> #include <limits.h> #include <sstream> #include <vector> #include <queue> #include <deque> #include <stack> #include <map> #include <unordered_map> #include <unordered_set> #include <set> //#pragma GCC optimize(2) //#pragma GCC optimize(3, "Ofast", "inlin") using namespace std; #define ios ios::sync_with_stdio(false) , cin.tie(0) #define x first #define y second typedef long long LL; typedef unsigned long long ULL; typedef pair<int, int> PII; const int N = 100010, INF = 0x3f3f3f3f, mod = 1e9 + 7, base = 131; const double eps = 1e-6, PI = acos(-1); int n; bool a[N]; int f[N]; void work() { cin >> n; memset(a, 0, sizeof a); memset(f, 0, sizeof f); for (int i = 0; i < n; i ++ ) { int x; cin >> x; a[x] = true; } int ans = 0; for (int i = 1; i <= 100000; i ++ ) { int t = i; if (a[i]) f[i] = max(f[i], 1), ans = max(ans, 1); else continue; for (int j = 2; j <= t / j; j ++ ) //枚举质因子 { if (t % j == 0 ) { for (int k = i + j; k <= 100000; k += j) { if (a[k]) { f[k] = max(f[k], f[i] + 1); ans = max(ans, f[k]); break; } } while (t % j == 0) t /= j; } } if (t > 1) { int j = t; for (int k = j + i; k <= 100000; k += j) { if (a[k]) { f[k] = max(f[k], f[i] + 1); ans = max(ans, f[k]); break; } } } } cout << ans << endl; } int main() { int T = 1; cin >> T; while (T -- ) { work(); } return 0; }