hdu 2846 字典树

来源:互联网 发布:淘宝网儿童棉服 编辑:程序博客网 时间:2024/04/30 08:18

给出N个字符串,给出M个询问。

问该串是多少个串的子串。

字典树。。

#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cmath>#include <cstring>#include <queue>#include <set>#include <vector>#include <stack>#include <map>#include <iomanip>#define PI acos(-1.0)#define Max 2005#define inf 1<<28#define LL(x) (x<<1)#define RR(x) (x<<1|1)#define ll long longusing namespace std;struct Trie{    int count;//记录经过这个分支的个数    int id;    struct Trie *next[26];    Trie()    {        id=0;        count=0;        memset(next,0,sizeof(next));    }};Trie *root=NULL;void build_Trie(char *s,int id)//建树{    Trie *p=root;    Trie *temp=NULL;    int l=strlen(s);    for(int i=0; i<l; i++)    {        int index=s[i]-'a';        if(p->next[index]==NULL)        {            temp=new Trie;            p->next[index]=temp;        }        p=p->next[index];        if(p->id!=id)        {            p->count++;            p->id=id;        }    }}int Trie_search(char *s){    Trie *p=root;    int l=strlen(s);    for(int i=0; i<l; i++)    {        int index=s[i]-'a';        if(p->next[index]==NULL)            return 0;        p=p->next[index];    }    //cout<<endl;    return p->count;}int main(){    char a[1002];    int i=0;    root =new Trie;    int n,m;    cin>>n;    for(int i=1; i<=n; i++)    {        cin>>a;        int l=strlen(a);        for(int j=0; j<l; j++)//对每个子串建一个分支            build_Trie(&a[j],i);    }    cin>>m;    while(m--)    {        cin>>a;        cout<<Trie_search(a)<<endl;    }    return 0;}


原创粉丝点击