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