제출 #1283218

#제출 시각아이디문제언어결과실행 시간메모리
1283218StefanSebez회문 (APIO14_palindrome)C++20
100 / 100
49 ms59764 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define ll long long #define ld long double #define mp make_pair const int N=3e5+50; struct PalindromicTree{ string s;int len[N]; int link[N],go[N][26],cnt[N],nc,Im,Nula,sada; vector<int>E[N]; PalindromicTree(){ Im=++nc;link[Im]=Im;len[Im]=-1; Nula=++nc;link[Nula]=Im; sada=Im; } void Insert(char x){ s.pb(x);int n=s.size(); while(s[n-1]!=s[n-2-len[sada]]) sada=link[sada]; if(!go[sada][x-'a']){ nc++; go[sada][x-'a']=nc; len[nc]=len[sada]+2; int u=link[sada]; while(s[n-1]!=s[n-2-len[u]]) u=link[u]; if(len[nc]==1) u=Nula; else u=go[u][x-'a']; link[nc]=u; } sada=go[sada][x-'a'];cnt[sada]++; } void DFS(int u){ for(auto i:E[u]) DFS(i),cnt[u]+=cnt[i]; } ll Solve(){ ll res=0; for(int i=2;i<=nc;i++) E[link[i]].pb(i); DFS(Im); for(int i=2;i<=nc;i++) res=max(res,(ll)len[i]*cnt[i]); return res; } }st; int main(){ string s;cin>>s; for(auto i:s) st.Insert(i); ll res=st.Solve(); printf("%lld\n",res); 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...