记录编号 478985 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [APIO 2014] Palindromes 最终得分 100
用户昵称 GravatarShirry 是否通过 通过
代码语言 C++ 运行时间 0.460 s
提交时间 2017-12-15 14:00:42 内存使用 38.34 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=300010;
struct PAM{
	char s[maxn];
	int ch[maxn][30],fail[maxn],cnt[maxn],len[maxn],last,now,p;
	long long ans;
	void newnode(int w){
		cnt[now]=0,len[now]=w,now++;
	}
	void init(){
		now=0,newnode(0),newnode(-1);
		last=p=0,s[0]=-1,fail[0]=1;
	}
	int getfail(int x){
		while(s[p-len[x]-1]!=s[p])x=fail[x];
		return x;
	}
	void extend(int x){
		p++;
		int cur=getfail(last);
		if(!ch[cur][x]){
			newnode(len[cur]+2);
			fail[now-1]=ch[getfail(fail[cur])][x];
			ch[cur][x]=now-1;
		}
		last=ch[cur][x];
		cnt[last]++;
	}
	long long count(){
		ans=0;
		for(int i=now-1;i>=0;i--)cnt[fail[i]]+=cnt[i],ans=max(ans,(long long)len[i]*cnt[i]);
		return ans;
	}
}pam;
int main(){
	freopen("apio2014_palindrome.in","r",stdin);
	freopen("apio2014_palindrome.out","w",stdout);
	pam.init();
	scanf("%s",pam.s+1);
	int l=strlen(pam.s+1);
	for(int i=1;i<=l;i++)pam.extend(pam.s[i]-'a');
	printf("%lld\n",pam.count());
	return 0;
}