l){ node *cur=que[tail++]; for(int i=0;i<=128;i++){ if(cur->next[i]!=NULL){ if(cur==root) cur->next[i]->fail=root; else cur->next[i]->fail=cur->fail->next[i]; que[head++]=cur->next[i]; } else{ if(cur==root) cur->next[i]=root; else cur->next[i]=cur->fail->next[i]; } } } } int query(char str[]){ int L=0; node *cur=root; for(int i=0;str[i];i++){ int val=str[i]; cur=cur->next[val]; node *tmp=cur; while(tmp!=root){ if(tmp->id>0&&!vis[tmp->id]){ ans[++L]=tmp->id; } tmp=tmp->fail; } } return L; } }ac; int main(){ int n; while(~scanf("%d",&n)){ ac.ini(); for(int i=1;i<=n;i++){ char s[220]; scanf("%s",s); ac.Insert(s,i); } ac.acfun(); int m; int cnt=0; scanf("%d",&m); for(int i=1;i<=m;i++){ memset(vis,0,sizeof(vis)); scanf("%s",web); int L=ac.query(web); if(L==0) continue; cnt++; sort(ans+1,ans+1+L); printf("web %d: ",i); for(int i=1;i<=L;i++) printf("%d%c",ans[i],i==L? '\n':' '); } printf("total: %d\n",cnt); } return 0; }
| 评论 |
|
|
