1 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=25*15; char s[25],t[(1<<20)+10]; int ch[N][26],id,ed[N],pre[N]; void ins(char *s) { int p=0,len=strlen(s); for(int i=0;s[i];i++) { int j=s[i]-'a'; if(ch[p][j]==0) ch[p][j]=++id; p=ch[p][j]; } ed[p]|=1<<(len-1); } void build() { queue<int> Q; for(int i=0;i<26;i++)if(ch[0][i])Q.push(ch[0][i]); while(!Q.empty()) { int x=Q.front();Q.pop(); ed[x]|=ed[pre[x]]; for(int i=0;i<26;i++) { int &y=ch[x][i]; if(y==0) y=ch[pre[x]][i]; else pre[y]=ch[pre[x]][i], Q.push(y); } } } int query(char *s) { int p=0,ans=0,cur=1; for(int i=0;s[i];i++) { p=ch[p][s[i]-'a']; if(cur&ed[p])cur=cur<<1|1,ans=i+1; else cur<<=1; } return ans; } int main() { int n,m;scanf("%d%d",&n,&m); id=0;memset(ch,0,sizeof(ch));memset(ed,0,sizeof(ed)); for(int i=1;i<=n; i++) { scanf("%s",s); ins(s); } memset(pre,0,sizeof(pre));build(); while(m--) { scanf("%s",t); printf("%d\n",query(t)); } return 0; }
- 1
信息
- ID
- 2865
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 104
- 已通过
- 21
- 上传者