QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#341607 | #801. 回文自动机 | SoyTony# | 0 | 6ms | 28692kb | C++14 | 1.3kb | 2024-02-29 20:04:29 | 2024-02-29 20:04:30 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int n;
char s[maxn];
struct PalindromeAutomaton{
int tot,last;
int ch[maxn][26];
int len[maxn],fail[maxn];
int cnt[maxn];
vector<int> E[maxn];
PalindromeAutomaton(){
tot=1,last=1;
len[0]=0,fail[0]=1;
len[1]=-1,fail[1]=1;
}
int get_fail(int u,int pos){
while(s[pos-len[u]-1]!=s[pos]) u=fail[u];
return u;
}
void extend(int pos){
int c=s[pos]-'a';
int u=get_fail(last,pos);
if(!ch[u][c]){
int f=get_fail(fail[u],pos);
ch[u][c]=++tot;
len[tot]=len[u]+2,fail[tot]=f;
}
++cnt[ch[u][c]];
last=ch[u][c];
}
void build(){
for(int i=0;i<=tot;++i){
if(i!=1) E[fail[i]].push_back(i);
}
}
void dfs(int u){
for(int v:E[u]){
dfs(v);
cnt[u]+=cnt[v];
}
}
void solve(){
dfs(1);
ll ans=0;
for(int i=2;i<=tot;++i) ans=max(ans,1ll*cnt[i]*len[i]*len[i]);
printf("%lld\n",ans);
}
}PAM;
int main(){
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;++i) PAM.extend(i);
PAM.build();
PAM.solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 6ms
memory: 28692kb
input:
bdgedcfadbabbfgeacdgbggaefddebabbfgeacdgbefaecfddffeddacbabfcgecedacbffeddacbabfebadggfafabcdfdeaabdeecgbcecegcgecedacbfgdagbgagafdegecadfebcdbgfacdecdegecadfebbcdfdeaabdbfgcbccfcaebcecfdfccagdafaeaacbggaefddebcbecdafageeaabcbdafadcbecdbcgcbdgedcfadbcaefbdfcbgfcdeceddaaffgcedfcdcgdcgbfdddfdadgagbbef...
output:
4772
result:
wrong answer expected '5594', found '4772'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%