比赛 20160414 评测结果 AAAAAAAAAA
题目名称 随机数消除器 最终得分 100
用户昵称 葳棠殇 运行时间 3.305 s
代码语言 C++ 内存使用 892.94 MiB
提交时间 2016-04-14 15:18:34
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. int n;
  5. char s[8000050];
  6. namespace PAM{
  7. int nt[8000050][26];
  8. int fail[8000050],len[8000050],s[8000050];
  9. int p,n,last;
  10. inline int newnode(int l){
  11. for(int i=0;i<26;i++)nt[p][i]=0;
  12. len[p]=l;
  13. return p++;
  14. }
  15. void init(){
  16. p=0;
  17. newnode(0),newnode(-1);
  18. last=0,n=0;
  19. s[n]=-1,fail[0]=1;
  20. }
  21. int Getfail(int x){
  22. while(s[n-len[x]-1]!=s[n])x=fail[x];
  23. return x;
  24. }
  25. void extend(int c){
  26. c-='a';
  27. s[++n]=c;
  28. int cur=Getfail(last);
  29. if(!nt[cur][c]){
  30. int now=newnode(len[cur]+2);
  31. fail[now]=nt[Getfail(fail[cur])][c];
  32. nt[cur][c]=now;
  33. }
  34. last=nt[cur][c];
  35. }
  36. };
  37. int main(){
  38. freopen("randomb.in","r",stdin);freopen("randomb.out","w",stdout);
  39. scanf("%s",s);n=strlen(s);
  40. PAM::init();
  41. for(int i=0;i<n;i++)PAM::extend(s[i]);
  42. printf("%d\n",PAM::p-2);
  43. }