Submission #307946

#TimeUsernameProblemLanguageResultExecution timeMemory
307946tushar_2658Palindromes (APIO14_palindrome)C++14
100 / 100
32 ms36064 KiB
#include "bits/stdc++.h" using namespace std; const int maxn = 600005; using ll = long long; int t[maxn][26], link[maxn], len[maxn]; int node, cur; ll dp[maxn]; string s; void init(){ len[1] = -1; len[2] = 0; link[1] = 1; link[2] = 1; node = cur = 2; } void extend(int idx){ while(s[idx - len[cur] - 1] != s[idx]){ cur = link[cur]; } int x = link[cur]; while(s[idx - len[x] - 1] != s[idx]){ x = link[x]; } int c = s[idx] - 'a'; if(!t[cur][c]){ t[cur][c] = ++node; len[node] = len[cur] + 2; if(len[node] == 1){ link[node] = 2; }else { link[node] = t[x][c]; } } cur = t[cur][c]; dp[cur]++; } int main(int argc, char const *argv[]) { ios::sync_with_stdio(false); cin.tie(0); cin >> s; s = "#" + s; init(); int n = s.size(); for(int i = 1; i < n; ++i){ extend(i); } ll ans = 0; for(int i = node; i > 2; --i){ dp[link[i]] += dp[i]; } for(int i = node; i > 2; --i){ ans = max(ans, len[i] * 1LL * dp[i]); } cout << ans << endl; return 0; }
#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...