字典树从第i个构造HDU2846

http://www.cnblogs.com/ziyi--caolu/archive/2012/12/13/2816279.html  (参考)

 

附我的代码:

/****HDU2846
    *构造 字典树 的方法
    *字符串匹配
    *STRING S=X1X2X3X4...
    *X1...  +X2...+X3...+ + +...
    **ABABBBB  ABABBB AND ABBBB  IS  REPEATED !
    * CREATE A TAG
*/
#include <bits/stdc++.h>
using namespace std;

const int maxn=500050;//600050  Memory Limit Exceeded
                        //400050 Runtime Error (ACCESS_VIOLATION)   array out
struct node
{
    int nxt[26];
    int num;
    int tag;
}tre[maxn];
int p,q,cnt,len;
char s[50];
void add(int now,int x)
{
    if(len==x) return;
    int  v=s[x]-'a';
    if(!tre[now].nxt[v]) tre[now].nxt[v]=++cnt;
    if(tre[tre[now].nxt[v]].tag!=p+1)
    {
        tre[tre[now].nxt[v]].num++;
        tre[tre[now].nxt[v]].tag=p+1;
    }
    add(tre[now].nxt[v],x+1);
}

int fin(int now,int x)
{
    if(len==x) return tre[now].num;
    int v=s[x]-'a';
    if(!tre[now].nxt[v])return 0;
    fin(tre[now].nxt[v],x+1);
}
int main()
{
    scanf("%d",&p);
    memset(tre,0,sizeof(tre));
    cnt=0;
    while(p--)
    {
        scanf("%s",s);
        len=strlen(s);
        for(int i=0;i<len;i++)
            add(0,i);
    }
    scanf("%d",&q);
    while(q--)
    {
        scanf("%s",s);
        len=strlen(s);
        printf("%d\n",fin(0,0));
    }
    return 0;
}
View Code

 

posted @ 2017-04-27 20:49  小螺号打豆豆  阅读(199)  评论(0编辑  收藏  举报