http://acm.hdu.edu.cn/showproblem.php?pid=2896
注意输入数据不止有字母。
没什么特别的地方,用来熟悉算法。
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
#include<iostream>
using namespace std;
#define N 210
#define M 10100
bool vis[510];
char str[N],page[M];
int total,n_ans;
int ans[10];
struct node{
int cnt;
node *next[130];
node *fail;
node(){
fail=NULL;
cnt=0;
for(int i=0;i<130;i++) next[i]=NULL;
}
}*root;
void insert(int num){
int len,temp;
node *p=root;
len=strlen(str);
for(int i=0;i<len;i++){
temp=str[i]-31;//printf("1?\n");
if(p->next[temp]==NULL)
p->next[temp]=new node();
p=p->next[temp];
}
p->cnt=num;
}//insert
void build_ac(){
node *p=root,*temp,*cur;
queue<node*>q;
q.push(p);
while(!q.empty()){
cur=q.front(); q.pop();
for(int i=0;i<130;i++){
temp=cur->next[i];
if(temp!=NULL){
if(cur==root) temp->fail=root;
else{
p=cur->fail;
while(p){
if(p->next[i]){temp->fail=p->next[i];break;}
p=p->fail;
}//while
if(!p) temp->fail=root;
}//else
q.push(temp);
}//if
}//for_26
}//while
}//build_ac
void query(){
memset(vis,0,sizeof(vis));
int len,index;
len=strlen(page);
node *p;
p=root;
for(int i=0;i<len;i++){
index=page[i]-31;
while(!p->next[index]&&p!=root) p=p->fail;
p=p->next[index];
if(p==NULL) p=root;
node *temp=p;
while(temp->cnt&&temp!=root&&!vis[temp->cnt]){
vis[temp->cnt]=1;
ans[n_ans++]=temp->cnt;
if(n_ans>=3) return;
}
}
}//query0
int main(){
int n,m;
root = new node();
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++){
gets(str);
insert(i+1); //printf("%s\n",str);
}
build_ac();
scanf("%d",&m);
total=0;
getchar();
for(int i=0;i<m;i++){
gets(page);
n_ans=0;
query();
if(n_ans) {
sort(ans,ans+n_ans);
total++;
printf("web %d:",i+1);
for(int j=0;j<n_ans;j++) printf(" %d",ans[j]);
printf("\n");
}//if
}//for
printf("total: %d\n",total);
return 0;
}