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