记录编号 |
462028 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HNOI 2004] L语言 |
最终得分 |
100 |
用户昵称 |
하루Kiev |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.460 s |
提交时间 |
2017-10-21 08:00:57 |
内存使用 |
15.95 MiB |
显示代码纯文本
# include "iostream"
# include "stdio.h"
# include "algorithm"
# include "string.h"
# include "math.h"
using namespace std;
struct trie{trie *no[30];bool en;}*root,node[100005];
int cnt,zz;
trie *newnode(){return &node[++zz];}
void buildtree(char *s){
int l=strlen(s+1);
trie *k=root;
for(int i=1;i<=l;i++){
if(k->no[s[i]-'a']==NULL)
k->no[s[i]-'a']=newnode();
k=k->no[s[i]-'a'];
}k->en=true;
}
int n,m,ans;
bool f[2000005];
char s1[2000005];
void find(int l,int r,char *s){
trie *k=root;
for(int j=l;j<=r;j++){
if(k->no[s1[j]-'a']==NULL) return;
k=k->no[s1[j]-'a'];
if(k->en) f[j]=true;
}
}
int main(){
freopen("language.in","r",stdin);
freopen("language.out","w",stdout);
scanf("%d%d",&n,&m);
root=newnode();
for(int i=1;i<=n;i++){
scanf("%s",s1+1);
buildtree(s1);
}
for(int i=1;i<=m;i++){
scanf("%s",s1+1);
memset(f,0,sizeof(f));
f[0]=true;
int sz=strlen(s1+1);
for(int i=0;i<=sz;i++)
if(f[i]){
f[i]=false;
ans=i;
find(i+1,sz,s1+1);
}
printf("%d\n",ans);
}
}