intmain(){ int q; cin >> q; while (q--) { int n, la = -1; cin >> n; vector<int> b(n + 1); for (int i = 0; i < n; ++i) { int k, t, f = 0; cin >> k; while (k--) { cin >> t; if (!f && !b[t]) b[t] = f = 1; } if (!f) la = i + 1; } if (la == -1) { cout << "OPTIMAL" << endl; continue; } for (int i = 1; i <= n; ++i) { if (!b[i]) { cout << "IMPROVE" << endl << la << ' ' << i << endl; break; } } } return0; }
intmain(){ int n, m, k, a, b; cin >> n >> m >> k; for (int i = 0; i < k * 2; ++i) { cin >> a >> b; } cout << n + m - 2 + n * (m - 1) + n << endl; for (int i = 1; i < m; ++i) cout << 'L'; for (int i = 1; i < n; ++i) cout << 'U'; for (int i = 0; i < n; ++i) { for (int j = 1; j < m; ++j) { if (i & 1) cout << 'L'; else cout << 'R'; } cout << 'D'; } cout << endl; return0; }
#include<bits/stdc++.h> usingnamespacestd; constint N = 2e5 + 5;
int p[N], c[N];
intmain(){ int T; cin >> T; while (T--) { int n; cin >> n; for (int i = 1; i <= n; ++i) cin >> p[i]; for (int i = 1; i <= n; ++i) cin >> c[i];
int ans = INF32; vector<int> tmp; for (int i = 1; i <= n; ++i) { if (c[i]) { tmp.clear(); int j = i; while (c[j]) { tmp.emplace_back(c[j]); c[j] = 0; j = p[j]; } int m = tmp.size(); for (int k = 1; k * k <= m; ++k) { if (m % k) continue; for (int strt = 0; strt < k; ++strt) { bool ok = true; j = strt; while (j < m) { if (tmp[j] != tmp[(j + k) % m]) { ok = false; break; } j += k; } if (ok) ans = min(ans, k); } for (int strt = 0; strt < m / k; ++strt) { bool ok = true; j = strt; while (j < m) { if (tmp[j] != tmp[(j + m / k) % m]) { ok = false; break; } j += m / k; } if (ok) ans = min(ans, m / k); } } } } cout << ans << endl; } return0; }
classahcm { #define nd node[u] public: structNODE { int ch[csize]; int fail, val; } node[N]; int numv; queue<int> Q, q;
ahcm() { numv = 0; }
voidinsert(string &s, int &v){ int u = 0; for (char &c : s) { if (!nd.ch[c - 'a']) nd.ch[c - 'a'] = ++numv; u = nd.ch[c - 'a']; } nd.val += v; }
voidbuild(){ for (int &i : node[0].ch) { if (i) Q.emplace(i); } while (!Q.empty()) { int u = Q.front(); Q.pop();
q.emplace(u); for (int i = 0; i < csize; ++i) { if (nd.ch[i]) { node[nd.ch[i]].fail = node[nd.fail].ch[i]; node[nd.ch[i]].val += node[node[nd.ch[i]].fail].val; Q.emplace(nd.ch[i]); } else nd.ch[i] = node[nd.fail].ch[i]; } } }
pil calc(int u, string &s){ ll v = 0; for (char &c : s) { u = nd.ch[c - 'a']; v += nd.val; } return {u, v}; } }; } usingnamespaceString;
ahcm am; pil go[1005][18]; ll dp[1005][sz];
intmain(){ int n, v; cin >> n; string s; for (int i = 0; i < n; ++i) { cin >> s >> v; am.insert(s, v); } am.build();
cin >> s; int la = 0; vector<string> seg; for (int i = 0; i < s.length(); ++i) { if (s[i] == '?') { seg.push_back(s.substr(la, i - la)); la = i + 1; } } seg.push_back(s.substr(la)); for (int i = 0; i < seg.size(); ++i) { for (int j = 0; j <= am.numv; ++j) { go[j][i] = am.calc(j, seg[i]); } }
for (int i = 0; i <= am.numv; ++i) { for (int j = 0; j < sz; ++j) { dp[i][j] = -INF64; } } dp[go[0][0].first][0] = go[0][0].second; for (int i = 0; i < sz; ++i) { for (int j = 0; j <= am.numv; ++j) { if (dp[j][i] == -INF64) continue; for (int k = 0; k < 14; ++k) { if ((i >> k) & 1) continue; int to = am.node[j].ch[k]; int ns = i | (1 << k); int count = __builtin_popcount(ns); if (count >= seg.size()) continue; intend = go[to][count].first; ll val = go[to][count].second + am.node[to].val; dp[end][ns] = max(dp[end][ns], dp[j][i] + val); } } } ll ans = -INF64; int cnt = seg.size() - 1; for (int i = 0; i < sz; ++i) { for (int j = 0; j <= am.numv; ++j) { if (__builtin_popcount(i) == cnt) ans = max(ans, dp[j][i]); } } cout << ans << endl; return0; }