记录编号 252169 评测结果 AAAAAAAAAA
题目名称 情书 最终得分 100
用户昵称 GravatarSatoshi 是否通过 通过
代码语言 C++ 运行时间 0.648 s
提交时间 2016-04-19 16:58:08 内存使用 5.06 MiB
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <queue>
#include <string>
#include <cstring>
#define N 210
using namespace std;
ifstream in("lettera.in");
ofstream out("lettera.out");
int n;
class ACmachine
{
public:
	int cnt;
	int fail[N*N];
	int flag[N*N];
	int nex[N*N][26];
	bool vis[N*N];
	queue<int > Q;
	int fit;
	ACmachine()
	{
		cnt=1;
		memset(flag,0,sizeof(flag));
		memset(vis,0,sizeof(vis));
		for(int i=0;i<26;i++)nex[0][i]=1;
	}
	void add(string T,int id)
	{
		int u=1;
		for(int i=0;i<T.length();i++)
		{
			int c=T[i]-'a';
			if(!nex[u][c])nex[u][c]=++cnt;
			u=nex[u][c];
		}
		flag[u]=id;
	}
	void makefail()
	{
		fail[1]=0;
		Q.push(1);
		while(!Q.empty())
		{
			int u=Q.front();
			Q.pop();
			for(int i=0;i<26;i++)
			{
				int v=nex[u][i];
				int k=fail[u];
				if(v)
				{
					while(!nex[k][i])k=fail[k];
					fail[v]=nex[k][i];
					Q.push(v);
				}
			}
		}
	}
	void DFS(int u)
	{
		while(u)
		{
			if(vis[u])return ;
			vis[u]=1;
			if(flag[u])fit++;
			u=fail[u];
		}
	}
	bool check(string S)
	{
		int u=1;
		fit=0;
		memset(vis,0,sizeof(vis));
		for(int i=0;i<S.length();i++)
		{
			int c=S[i]-'a';
			while(!nex[u][c])u=fail[u];
			u=nex[u][c];
			DFS(u);
		}
		//out<<fit<<endl;
		return fit==n;
	}
}AC;
int main()
{
	string S,T;
	in>>n;
	//AC.ACmachine();
	//AC.cnt=1;
	for(int i=1;i<=n;i++)
	{
		in>>T;
		AC.add(T,i);
	}
	AC.makefail();
	while(in>>S)
	{
		S.erase(S.length()-1);
		if(AC.check(S))out<<"Yes"<<endl;
		else out<<"No"<<endl;
	}
	return 0;
}