hdu 1277 全文检索

来源:互联网 发布:linux新建文档命令 编辑:程序博客网 时间:2024/04/27 02:02

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1277

题目大意及思路:和前一个题相同,只是这个题要求输出id。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<string>#include<queue>#include<algorithm>#include<vector>#include<stack>#include<list>#include<iostream>#include<map>using namespace std;#define inf 0x3f3f3f3f#define Max 11000char s[60010],str[66];int ans[1010],rec;char st[60010];int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}int q[Max*60],cnt;struct node{    int id,fail;    int next[10];    void init()    {        id=fail=0;        memset(next,0,sizeof(next));    }}tri[Max*60];void insert(char *s,int num){    int i,p,id;    p=0;    for(i=0;s[i];i++)    {        id=s[i]-'0';        if(!tri[p].next[id])        {            tri[++cnt].init();            tri[p].next[id]=cnt;        }        p=tri[p].next[id];    }    tri[p].id=num;}void bfs(){    int i,id,suf,p,head,tail;    p=0;head=tail=0;    for(i=0;i<10;i++)    {        if(tri[0].next[i])        {            q[tail++]=tri[0].next[i];            tri[q[tail-1]].fail=0;        }        else            tri[0].next[i]=0;    }    while(head<tail)    {        //printf("akkkk");        p=q[head++];suf=tri[p].fail;        for(i=0;i<10;i++)        {            if(tri[p].next[i])            {                q[tail++]=tri[p].next[i];                tri[q[tail-1]].fail=tri[suf].next[i];            }            else            {                tri[p].next[i]=tri[suf].next[i];            }        }    }}int query(char *s){    int i,id,p,tmp;    p=0;    for(i=0;s[i];i++)    {        id=s[i]-'0';        p=tri[p].next[id];        tmp=p;        if(tmp&&tri[tmp].id!=-1)        {            if(tri[tmp].id)            ans[rec++]=tri[tmp].id;            tri[tmp].id=-1;            tmp=tri[tmp].fail;        }    }    return rec;}int main(){    int n,m,i;    while(scanf("%d%d",&m,&n)!=EOF)    {        s[0]=0;        tri[0].init();        cnt=0;        rec=0;        while(m--)        {            scanf("%s",st);            strcat(s,st);        }      //  printf("%s\n",s);        for(i=1;i<=n;i++)        {            scanf("%s%s%s%s",str,str,str,str);            insert(str,i);        }        bfs();       if(query(s)==0)            puts("No key can be found !");        else        {            printf("Found key:");            for(i=0;i<rec;i++)            {                  printf(" [Key No. %d]",ans[i]);            }            puts("");        }    }}


 

原创粉丝点击