怎么这么魔性。答案最后不换行wa,换行ac
查看原帖
怎么这么魔性。答案最后不换行wa,换行ac
30510
wanghai673楼主2018/8/26 22:28
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
string s[maxn],t;
bool book[maxn];
int ch[maxn][27],l[maxn],top=0,f[maxn],nxt[maxn],sz=1;
char ans[maxn];
void build(string s){
	int len=s.size(),u=1;
	for(int i=0;i<len;++i){
		int to=s[i]-'a'+1;
		if(!ch[u][to])ch[u][to]=++sz;
		u=ch[u][to];
	}
	book[u]=1;l[u]=len;
}
queue<int>Q;
void bfs(){
	Q.push(1);
	while(!Q.empty()){
		int u=Q.front();Q.pop();
		for(int i=1;i<=26;++i){
			if(!ch[u][i])ch[u][i]=ch[nxt[u]][i];
			else{
				nxt[ch[u][i]]=ch[nxt[u]][i];
				Q.push(ch[u][i]);
			}
		}
	}
}
int main(){
	cin>>t;
	int n;
	cin>>n;
	for(int i=1;i<=26;++i)ch[0][i]=1;
	for(int i=1;i<=n;++i){
		cin>>s[i];
		build(s[i]);
	}
	bfs();
	int len=t.size(),u=1;
	for(int i=0;i<len;++i){
		ans[++top]=t[i];
		int to=t[i]-'a'+1;
		u=ch[u][to];
		if(book[u]){
			top-=l[u];
			u=f[top];
		}
		else {
			f[top]=u;
		}
	}
	ans[top+1]='\0';
	cout<<(ans+1)<<endl; //不加endl wa第7个点
	return 0;
}
2018/8/26 22:28
加载中...