voidsolve(){ //字符串s2是否存在于s1中,如果存在,返回匹配的位置 cin >> s1 >> s2; n = s1.length(); m = s2.length(); int kmp[m + 5] = {}; int x = 0; kmp[0] = 0; for (int i = 1; i < m; i++) { while (x != 0 && s2[i] != s2[x])x = kmp[x - 1]; if (s2[i] == s2[x]) { x++; kmp[i] = x; } } int j = 0; int flag = 0; for (int i = 0; i < n; i++) { while (j != 0 && s1[i] != s2[j])j = kmp[j - 1]; if (s1[i] == s2[j])j++; if (j == m) { cout << i - m + 2 << endl;//输出位置 j = kmp[j - 1]; flag = 1; } } for (int i = 0; i < m; i++) { cout << kmp[i] << ' '; } return; }
voiddfs(ll root, ll dad){ for (ll i = head[root]; i; i = e[i].nxt) { ll son = e[i].to; if (dad == son) continue; dep[son] = dep[root] + 1; f[0][son] = root; dfs(son, root); } }
voidfinit(){ for (ll i = 1; i <= L; i++) for (ll j = 1; j <= n; j++) f[i][j] = f[i - 1][f[i - 1][j]]; }
ll LCA(ll x, ll y){ if (dep[x] < dep[y]) swap(x, y); for (ll i = L; i >= 0; i--) { if (dep[f[i][x]] < dep[y]) continue; x = f[i][x]; } if (x == y) return x; for (ll i = L; i >= 0; i--) { if (f[i][x] == f[i][y]) continue; x = f[i][x], y = f[i][y]; } return f[0][x]; }
voidmain(){ ll ta, tb, R; scanf("%d%d%d", &n, &m, &R); for (ll i = 1; i <= n - 1; i++) { scanf("%d%d", &ta, &tb); add(ta, tb); add(tb, ta); } f[0][R] = R; dfs(R, R); finit(); for (ll i = 1; i <= m; i++) scanf("%d%d", st + i, ed + i), printf("%d\n", LCA(st[i], ed[i])); return; } }
#include<bits/stdc++.h> usingnamespace std; #define int long long #define PII pair<int,int> //sg函数
int a[10] = {0, 1, 2, 3, 0, 1, 2, 3, 4, 5};
voidsolve(){ int n; cin >> n; int ans = 0; while (n--) { int x; cin >> x; int sgx = a[x % 10]; //打表得出的结论 ans ^= sgx; } if (ans == 0) { //先手输 cout << "Vinit"; } else { cout << "Ada"; } return; }
int f[200], sg[200];
intdfs(int x){ //暴力递归 / 记忆dp dfs可行的方案 map<int, int> m; for (int i = 1; x - f[i] >= 0; i++) { //可以取走斐波那契数列个石子 int nx = x - f[i]; //if(sg[nx]==-1)dfs(nx); m[sg[nx]]++; } //求mex int ans = 0; while (m[ans] > 0) ans++; //sg[x]=ans; return ans; }
signedmain(){ //打表找规律,状态0一定是0(nim游戏) f[0] = 0, f[1] = 1; //斐波那契数列 for (int i = 2; i <= 140; i++) f[i] = f[i - 1] + f[i - 2]; cout << 0 << ' '; for (int i = 1; i <= 100; i++) { sg[i] = dfs(i); cout << sg[i] << ' '; } //得出sg循环节是0123012345 int t; // cin >> t; t = 1; while (t--) { solve(); cout << endl; } return0; }
#include<bits/stdc++.h> usingnamespace std; typedeflonglong ll; ll l, r, num[20], dp[20][20][20][2][2][2][2]; //各维意义: 第几位 上一位数字 上两位数字 连过? <n? 4? 8? ll dfs(int step, int pr1, int pr2, bool lkd, bool stn, bool ap4, bool ap8){ ll ans = 0, limit; if (ap4 && ap8) return0; //不能同时出现 4 和 8 if (step <= 0) return lkd; //搜索到头,返回这个数是否合法。本句相当于同时判断两个条件。实际上,只有这个和前面的那一句条件满足,答案才合法。 if (dp[step][pr1][pr2][lkd][stn][ap4][ap8]) return dp[step][pr1][pr2][lkd][stn][ap4][ap8]; //记忆化 if (stn) limit = 9; else limit = num[step]; //保证枚举的数字<=n for (ll i = 0; i <= limit; i++) //枚举算符 ans += dfs(step - 1, i, pr1, lkd || (pr1 == pr2 && pr1 == i), stn || (i < num[step]), ap4 || i == 4, ap8 || i == 8); return dp[step][pr1][pr2][lkd][stn][ap4][ap8] = ans; }
ll solve(ll x){ ll len = 0, ans = 0; if (x < 10000000000) return0; memset(dp, 0, sizeof(dp)); memset(num, 0, sizeof(num)); while (x) num[++len] = x % 10, x /= 10; for (ll i = 1; i <= num[len]; i++) //从高位 ans += dfs(10, i, 0, 0, i < num[len], i == 4, i == 8); return ans; }
// 第一个 >= x 的索引,没有返回 -1 intfirst_ge(const vector<int>& a, int x){ auto it = lower_bound(a.begin(), a.end(), x); return it == a.end() ? -1 : int(it - a.begin()); }
// 最后一个 <= x 的索引,没有返回 -1 intlast_le(const vector<int>& a, int x){ auto it = upper_bound(a.begin(), a.end(), x); return it == a.begin() ? -1 : int(prev(it) - a.begin()); }
ll n, m, siz[N], vis[N], ans[N], que[N]; vector<PII> e[N]; bitset<M> b;
voidgetSiz(ll root, ll dad){ siz[root] = 1; for (auto [son, w] : e[root]) { if (son == dad || vis[son]) { continue; } getSiz(son, root); siz[root] += siz[son]; } }
ll getCent(ll root, ll dad, ll tal){ for (auto [son, w] : e[root]) { if (son == dad || vis[son]) { continue; } if (siz[son] > tal / 2) { returngetCent(son, root, tal); } } return root; }
voidgetInfo(ll root, ll dad, ll dis, vector<ll> &ret){ if (dis > M - 10) { return; } ret.push_back(dis); for (auto [son, w] : e[root]) { if (son == dad || vis[son]) { continue; } getInfo(son, root, dis + w, ret); } }
voidcalcAns(ll root){ getSiz(root, root); ll cent = getCent(root, root, siz[root]); vector<ll> pre; pre.push_back(0); b[0] = 1; for (auto [son, w] : e[cent]) { if (vis[son]) { continue; } vector<ll> cur; getInfo(son, cent, w, cur); for (auto dis : cur) { for (ll i = 1; i <= m; i++) { if (que[i] >= dis && b[que[i] - dis]) { ans[i] = 1; } } } for (auto dis : cur) { if (!b[dis]) { pre.push_back(dis); b[dis] = 1; } } } for (auto dis : pre) { b[dis] = 0; } pre.clear(); vis[cent] = 1; for (auto [son, w] : e[cent]) { if (vis[son]) { continue; } calcAns(son); } }
voidsolve(){ cin >> n >> m; for (ll i = 1, u, v, w; i <= n - 1; i++) { cin >> u >> v >> w; e[u].push_back({v, w}); e[v].push_back({u, w}); } for (ll i = 1; i <= m; i++) { cin >> que[i]; } calcAns(1); for (ll i = 1; i <= m; i++) { if (ans[i]) { cout << "AYE" << endl; } else { cout << "NAY" << endl; } } }
intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); ll T = 1; while (T--) { solve(); } return0; }