Submission #1166056

#TimeUsernameProblemLanguageResultExecution timeMemory
1166056SangPalindromes (APIO14_palindrome)C++20
100 / 100
89 ms103848 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++) #define FORD(i, a, b) for (int i = (a), _b = (b); i >= _b; i--) #define fi first #define se second #define pb push_back #define ALL(a) (a).begin(), (a).end() #define task "kbsiudthw" typedef vector<int> vi; typedef pair<int, int> ii; typedef pair<int, ii> pii; const int N = 3e5 + 5; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 2277; struct Node{ int nxt[26], len, sufflink, cnt; vector<int> edges; }; int len, num, suff; string s; Node tree[N]; bool addLetter(int pos){ int cur = suff, curlen = 0; int let = s[pos] - 'a'; while (1){ curlen = tree[cur].len; if (pos - 1 - curlen >= 1 && s[pos-1-curlen] == s[pos]) break; cur = tree[cur].sufflink; } if (tree[cur].nxt[let]){ suff = tree[cur].nxt[let]; tree[tree[cur].nxt[let]].cnt++; return false; } ++num; suff = num; tree[num].len = tree[cur].len + 2; tree[cur].nxt[let] = num; tree[num].cnt = 1; if (tree[num].len == 1){ tree[num].sufflink = 2; tree[2].edges.pb(num); return true; } while (true){ cur = tree[cur].sufflink; curlen = tree[cur].len; if (pos - 1 - curlen >= 1 && s[pos-1-curlen] == s[pos]) { tree[num].sufflink = tree[cur].nxt[let]; tree[tree[cur].nxt[let]].edges.pb(num); break; } } return 1; } void initTree(){ num = 2; suff = 2; tree[1].len = -1; tree[1].sufflink = 1; tree[2].len = 0; tree[2].sufflink = 1; tree[1].edges.pb(2); } int dfs(int u){ int ans = 0; for (int &v : tree[u].edges){ ans = max(ans, dfs(v)); tree[u].cnt += tree[v].cnt; } ans = max(ans, tree[u].len * tree[u].cnt); return ans; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } cin >> s; len = s.size(); s = ' ' + s; initTree(); FOR (i, 1, len) { addLetter(i); } cout << dfs(1); return 0; }

Compilation message (stderr)

palindrome.cpp: In function 'int main()':
palindrome.cpp:91:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   91 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
palindrome.cpp:92:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   92 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...