比赛 20160414 评测结果 AAAAAAAAAA
题目名称 随机数消除器 最终得分 100
用户昵称 葳棠殇 运行时间 3.305 s
代码语言 C++ 内存使用 892.94 MiB
提交时间 2016-04-14 15:18:34
显示代码纯文本
#include <cstdio>
#include <cstring>
using namespace std;
int n;
char s[8000050];
namespace PAM{
	int nt[8000050][26];
	int fail[8000050],len[8000050],s[8000050];
	int p,n,last;
	inline int newnode(int l){
		for(int i=0;i<26;i++)nt[p][i]=0;
		len[p]=l;
		return p++;
	}
	void init(){
		p=0;
		newnode(0),newnode(-1);
		last=0,n=0;
		s[n]=-1,fail[0]=1;
	}
	int Getfail(int x){
		while(s[n-len[x]-1]!=s[n])x=fail[x];
		return x;
	}
	void extend(int c){
		c-='a';
		s[++n]=c;
		int cur=Getfail(last);
		if(!nt[cur][c]){
			int now=newnode(len[cur]+2);
			fail[now]=nt[Getfail(fail[cur])][c];
			nt[cur][c]=now;
		}
		last=nt[cur][c];
	}
};
int main(){
	freopen("randomb.in","r",stdin);freopen("randomb.out","w",stdout);
	scanf("%s",s);n=strlen(s);
	PAM::init();
	for(int i=0;i<n;i++)PAM::extend(s[i]);
	printf("%d\n",PAM::p-2);
}