比赛 |
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);
}