比赛 20150420 评测结果 AWAWWAWWAAWWWTA
题目名称 审查 最终得分 40
用户昵称 wolf. 运行时间 1.802 s
代码语言 C++ 内存使用 0.29 MiB
提交时间 2015-04-20 10:05:22
显示代码纯文本
#include<iostream>
#include<fstream>
#include<bitset>
#include<vector>
#include<deque>
#include<map>
#include<set>
#include<queue>
#include<string>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstdio>
using namespace std;
#if defined wolf
const string ok="OK";
const string kk="	";
ofstream nnew("censor.in",ios::app);
ifstream fin("censor.in");
#define fout cout
#define Endl endl
#else
ifstream fin("censor.in");
ofstream fout("censor.out");
#endif
class node{
public:
	int back;
	int n;
	int k;
	bool flag;
	vector<int> son;
	node(){
		flag=0;
		k=0;
		son.resize(26,0);
	}
	node(int a){
		n=a;
		k=0;
		flag=0;
		son.resize(26,0);
	}
	int find(int n){
		if(n<0||n>=26)
			return 0;
		return son[n];
	}
	void insert(int n,int v){
		son[n]=v;
	}
};
vector<node> TT;
string text;
void _insert(string txt){
	int it=0;
	for(int i=0;i!=txt.size();++i){
		int pp=TT[it].find(txt[i]-'a');
		if(pp==0){
			TT[it].insert(txt[i]-'a',TT.size());
			TT.push_back(node(txt[i]-'a'));
			it=TT.size()-1;
		}else{
			it=pp;
		}
	}
	TT[it].k=txt.size();
	TT[it].flag=1;
}
void AC(){
	TT[0].back=0;
	queue<int> Q;//储存下一个点的下标
	for(int i=0;i!=26;++i){
		int pp=TT[0].find(i);
		if(pp==0){
			continue;
		}
		TT[pp].back=0;
		Q.push(pp);
	}
	while(!Q.empty()){
		int now=Q.front();
		Q.pop();
		for(int i=0;i!=26;++i){
			int nex=TT[now].find(i);
			if(nex!=0){
				Q.push(nex);
				int it=TT[now].back;
				int record=TT[it].find(TT[nex].n);
				while(it!=0&&record==0){
					it=TT[it].back;
					record=TT[it].find(TT[nex].n);
				}
				TT[nex].back=record;
			}
		}
	}
}
int ans=0;
/*void _plus(int it,int i){
	whitle(it!=0){
		itf(TT[it].flag!=0){
			ans++;
		}
		it=TT[it].back;
	}
}*/
void core(int mmax){
	int it=0;
	for(int i=0;i!=text.size();++i){
		if(text[i]=='@'){
			continue;
		}
		int r=TT[it].find(text[i]-'a');
		while(r==0&&it!=0){
			it=TT[it].back;
			r=TT[it].find(text[i]-'a');
		}
		if(r==0){
			it=0;
			continue;
		}
		it=r;
		if(TT[it].flag){
			//cout<<text.substr(0,i)<<endl;
			int l=0;
			for(int j=i;j>=0;--j){
				if(text[j]=='@'){
					continue;
				}
				text[j]='@';
				l++;
				if(l==TT[it].k){
					break;
				}
			}
			i-=TT[it].k;
			i-=mmax;
			it=0;
			if(i<0){
				i=0;
			}
		}
	}
}
int main(){
	fin>>text;
	int n,mmax=0;
	fin>>n;
	TT.resize(1,-1);
	for(int i=0;i!=n;++i){
		string txt;
		fin>>txt;
		mmax=max(mmax,(int)txt.size());
		_insert(txt);
	}
	AC();
	/*for(int i=0;i!=TT.size();++i){
		cout<<(char)(TT[i].n+'a')<<kk<<TT[i].flag<<kk<<TT[i].back<<endl;
	}*/
	core(mmax);
	for(int i=0;i!=text.size();++i){
		if(text[i]!='@'){
			fout<<text[i];
		}
	}
	//cout<<ans<<endl;
	//-------------------------*/
	#if defined wolf
	cout<<endl<<(double)clock()/CLOCKS_PER_SEC<<'s'<<endl;
	#endif
	return 0;
}
//Designed by wolf
//Mon Apr 20 2015