比赛 20150420 评测结果 AAAAAAAAAAAAAAA
题目名称 审查 最终得分 100
用户昵称 Asm.Def 运行时间 0.236 s
代码语言 C++ 内存使用 17.19 MiB
提交时间 2015-04-20 11:51:48
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std;
//#define USEFREAD
#ifdef USEFREAD
#define InputLen 5000000
char *ptr=(char *)malloc(InputLen);
#define getc() (*(ptr++))
#else
#define getc() (getchar())
#endif
#define SetFile(x) (freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout))
template<class T>inline void getd(T &x){
    char ch = getc();bool neg = false;
    while(!isdigit(ch) && ch != '-')ch = getc();
    if(ch == '-')ch = getc(), neg = true;
    x = ch - '0';
    while(isdigit(ch = getc()))x = x * 10 - '0' + ch;
    if(neg)x = -x;
}
/***********************************************************************/
const int maxn = 1000005, Sig = 26, maxm = 100005;
struct Trie *Root = NULL;
struct Trie{
	Trie *son[Sig], *fail;
	int rec;
	inline Trie *trans(int ch){
		if(son[ch])return son[ch];
		return fail ? fail->trans(ch) : Root;
	}
}trie[maxm], *Pit = trie;

char T[maxn], S[maxm], *begin[maxm], ans[maxn], *Ait = ans;
int Scnt;

void insert(Trie *&cur, char *it, char *end, int id){
	if(cur == NULL)cur = Pit++;
	if(it == end){
		cur->rec = id;
		return;
	}
	insert(cur->son[*it - 'a'], it+1, end, id);
}
#include <queue>
inline void Build(){
	queue<Trie *> Q;
	Trie *t, **s;
	int i;
	for(i = 0,s = Root->son;i < Sig;++i,++s)if(*s){
		(*s)->fail = Root;
		Q.push(*s);
	}
	while(!Q.empty()){
		t = Q.front();Q.pop();
		for(i = 0,s = t->son;i < Sig;++i,++s){
			if(*s){
				(*s)->fail = t->fail->trans(i);
				Q.push(*s);
			}
			else *s = t->trans(i);
		}
	}
}

inline void init(){
	begin[1] = S;
	scanf("%s", T);
	getd(Scnt);
	int i;
	char *it;
	for(i = 1;i <= Scnt;++i){
		it = begin[i];
		while(!isalpha(*it = getc()));++it;
		while(isalpha(*it = getc()))++it;
		insert(Root, begin[i], begin[i+1] = it, i);
	}
	Build();
}

Trie *loc[maxn], **lit = loc;
inline void work(){
	Trie *t = Root;
	char *it = T;
	int tmp, d;
	*(lit++) = Root;
	while(*it){
		t = t->trans(*it - 'a');
		*(Ait++) = *it;
		*(lit++) = t;
		if((tmp = t->rec)){
			d = begin[tmp+1] - begin[tmp];
			Ait -= d;lit -= d;
			t = *(lit - 1);
		}
		++it;
	}
	*Ait = 0;
	printf("%s\n", ans);
}

int main(){
	#ifdef DEBUG
	freopen("test.txt", "r", stdin);
	#else       
	SetFile(censor);
	#endif
	#ifdef USEFREAD
	fread(ptr,1,InputLen,stdin);
	#endif
	
	init();
	work();
	
#ifdef DEBUG
    printf("\n%.3lf sec \n", (double)clock() / CLOCKS_PER_SEC);
#endif
    return 0;
}