记录编号 |
252169 |
评测结果 |
AAAAAAAAAA |
题目名称 |
情书 |
最终得分 |
100 |
用户昵称 |
Satoshi |
是否通过 |
通过 |
代码语言 |
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;
}