记录编号 |
411505 |
评测结果 |
AAAAAAAAAA |
题目名称 |
情书 |
最终得分 |
100 |
用户昵称 |
Hzoi_Hugh |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.395 s |
提交时间 |
2017-06-05 12:28:39 |
内存使用 |
1.98 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define L 1350000
#define MAXN 100000
using namespace std;
char w[L+100];
bool via[101];
int n,ans;
struct Trie
{
vector<int>q;
Trie *ch[26],*fail;
Trie(){q.clear();memset(ch,0,sizeof(ch));fail=NULL;}
void* operator new(size_t size);
}*root,*C,*mempool,*q[MAXN];
inline int read()
{
memset(w,0,sizeof(w));
int l=0;
char ch;
if(cin>>ch){ while(ch!='$'){w[l++]=ch;ch=getchar();} w[l]=ch;return l;}
else return 0;
}
void* Trie :: operator new(size_t size)
{
if(C==mempool)
{
C=new Trie[(1<<15)+10];
mempool=C+(1<<15)+10;
}
return C++;
}
inline void insert(char *s,int x)
{
int len=strlen(s);
Trie *now=root;
for(int i=0;i<len;i++)
{
if(now->ch[s[i]-'a']==NULL)
now->ch[s[i]-'a']=new Trie();
now=now->ch[s[i]-'a'];
}
now->q.push_back(x);
}
inline void build()
{
root->fail=NULL;
q[0]=root;
for(int i=0,j=0;i<=j;i++)
for(int l=0;l<26;l++)
if(q[i]->ch[l])
{
Trie *now=q[i]->fail;
while(now&&!now->ch[l])now=now->fail;
q[i]->ch[l]->fail=now?now->ch[l]:root;
q[++j]=q[i]->ch[l];
}
}
inline void work()
{
memset(via,0,sizeof(via));
Trie *now=root;
for(int i=0;w[i]!='$';i++)
{
int to=w[i]-'a';
//cout<<"("<<now<<")";
while(now&&!now->ch[to])now=now->fail;
now=now?now->ch[to]:root;
//cout<<"("<<now<<")";
for(Trie *nown=now;nown;nown=nown->fail)
if(!nown->q.empty())
{
//cout<<"("<<nown<<")";
int l=nown->q.size();
for(int j=0;j<l;j++)
via[nown->q[j]]=1;
}
}
ans=0;
for(int i=1;i<=n;i++)
if(via[i])ans++;
if(ans==n)
printf("Yes\n");
else
printf("No\n");
}
int main()
{
freopen("lettera.in","r",stdin);
freopen("lettera.out","w",stdout);
root=new Trie();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
char s[1000];
scanf("%s",s);
insert(s,i);
}
build();
while(read()) work();
return 0;
}