hdu 2846 Repository

来源:互联网 发布:淘宝哪家银店真的吗 编辑:程序博客网 时间:2024/06/05 00:52

字典树变形题!很好的题~学会了很多!

#include <iostream>#include <stdio.h>#include <string.h>using namespace std;struct Trienode{    int cnt;    int id;    Trienode* next[26];};void insert(Trienode *root,char *s,int id){    Trienode *p = root;    int i = 0;    while(s[i]!='\0')    {        //cout<<i<<endl;        int k = s[i]-'a';        if(p->next[k] == NULL)        {            Trienode *tmp = new Trienode;            for(int j = 0;j < 26;j ++)            tmp->next[j] = NULL;tmp->cnt = 0;            tmp->id = -1;            p->next[k] = tmp;        }        p = p -> next[k];        if(p->id!=id){            p->id = id;        p->cnt ++;        }        i ++;    }}int search(Trienode *root,char *s){    int i,k;    Trienode *p = root;    i = 0;    while(s[i]!='\0')    {        k = s[i] - 'a';        if(p->next[k] == NULL) return 0;        else p = p -> next[k];        i ++;    }    return p->cnt;}int main(){    char s[20];    Trienode *root = new Trienode;    root ->cnt = 0;    for(int j = 0;j < 26;j ++)    root->next[j] = NULL;    int n,q,i;    while(scanf("%d",&n)!=EOF)    {        for(i = 0;i < n;i ++)        {            scanf("%s",&s);            for(int j = 0;j < strlen(s);j ++)            {                insert(root,s+j,i);                //cout<<s+j<<endl;            }        }        scanf("%d",&q);        while(q --)        {            scanf("%s",&s);            printf("%d\n",search(root,s));        }    }    return 0;}


原创粉丝点击