比赛 |
Mike梦境膜你赛 |
评测结果 |
TTTTTTTTTTEEEEEEEEEE |
题目名称 |
Mike的梦境 |
最终得分 |
0 |
用户昵称 |
再见 |
运行时间 |
15.504 s |
代码语言 |
C++ |
内存使用 |
111.32 MiB |
提交时间 |
2017-04-14 21:08:11 |
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
int n,op,cnt,tot,len[1000010],f[1000010],last[1000010],ch[1000010][26];
string str[100010],swa;
void extend(int la,int c,int w){
int p=la,id=str[c][w]-'a';
while(w-len[p]-1<0||str[c][w-len[p]-1]!=str[c][w]) p=f[p]/*,printf("%d ",p)*/;
if(!ch[p][id]){
cnt++; ch[p][id]=cnt;
len[cnt]=len[p]+2;
if(len[cnt]==1) f[cnt]=2;
else{
int q=f[p];
while(w-len[q]-1<0||str[c][w-len[q]-1]!=str[c][w]) q=f[q];
f[cnt]=ch[q][id];
}
}
last[c]=ch[p][id];
}
void build(int c){
last[c]=2; int l=str[c].length();
for(int i=0;i<l;i++)
extend(last[c],c,i);
}
void insert(int c){
int l=str[c].length();
str[c]+=swa;
int nl=str[c].length();
for(int i=l;i<nl;i++)
extend(last[c],c,i);
}
int main(){
freopen("classmate_easy.in","r",stdin);
freopen("classmate_easy.out","w",stdout);
ios::sync_with_stdio(false);
cin >> n;
len[1]=-1; len[2]=0;
f[1]=2; f[2]=1;
last[0]=cnt=2;
for(int i=1;i<=n;i++){
cin >> op;
if(op==1){
cin >> str[++tot];
build(tot);
}
if(op==2){
int k; cin >> k >> swa;
insert(k);
}
cout << cnt-2 << "\n";
}
return 0;
}