记录编号 284139 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [APIO 2014] Palindromes 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 0.603 s
提交时间 2016-07-17 08:32:36 内存使用 35.86 MiB
显示代码纯文本
# define maxc 26ul
# define maxn 300010ul

# include <stdio.h>
# include <string.h>
# include <algorithm>

struct node {
	node *ch[maxc],*fail;
	int len,v,id;
} *now,*root[2],*pre[maxn],spT[maxn];

char s[maxn]; int n,tot,N; long long ans=1;

void prepare() {
	root[0]=&spT[N=0];
	root[0]->id=N;
	root[1]=&spT[++N];
	root[1]->id=N;
	now=root[1];
	root[0]->fail=root[1]->fail=root[0];
	root[0]->len=-1,root[1]->len=0;
	n=0,tot=0; s[n++]=-1; return;
}

node* new_node(int x) {
	node *tmp=&spT[++N];
	tmp->id=N,pre[N]=tmp;
	tmp->len=x; return tmp;
}

node* get(node *p) {
	while(s[n-p->len-2]!=s[n-1])
		p=p->fail;
	return p;
}

void add(char c) {
	int t=c-'a'; s[n++]=c;
	node *p=get(now);
	if(p->ch[t]==NULL) {
		now=new_node(p->len+2);
		if(now->len==1) now->fail=root[1];
		else now->fail=get(p->fail)->ch[t];
		p->ch[t]=now,++tot;
	} now=p->ch[t],++now->v; return;
}

void count() {
	for(int i=N;i>=2;--i) {
		node *tmp=pre[i];
		if(tmp->fail) tmp->fail->v+=tmp->v;
		ans=std::max(ans,1ll*tmp->v*tmp->len);
	} return;
}

char str[maxn];

int main() {
	freopen("apio2014_palindrome.in","r",stdin);
	freopen("apio2014_palindrome.out","w",stdout);
	prepare(); scanf("%s",str); int len=strlen(str);
	for(int i=0;i<len;i++) add(str[i]);
	count(); printf("%lld\n",ans);
	return 0;
}