HDU 2846(Tire的变形)

来源:互联网 发布:java帮助文档手机版 编辑:程序博客网 时间:2024/06/03 19:45

http://acm.hdu.edu.cn/showproblem.php?pid=2846

题意:给你p个字符串,q次询问,问p个字符串中含有q的字符串的个数。

思路:看了别人的题解,讲p个字符串的后缀也存入字典树,但是这样会有abab这种字符串出现重复计数的情况,用vis作为标记,鶸表达能力有限,详细看代码。

#include <iostream>#include <stdio.h>#include <string.h>#define maxn 500010using namespace std;int cnt=1;struct Tire{    int pointer[26];    int value;    int vis;    Tire()    {        memset(pointer,0,sizeof(pointer));        value=0;        vis=0;    }}pile[maxn];void Build(char *s,int ID)///建树{    int var=0,len=strlen(s);    for(int i=0;i<len;i++)    {        int id=s[i]-'a';        if(pile[var].pointer[id]==0)        {            var=pile[var].pointer[id]=cnt++;            pile[var].value++;            pile[var].vis=ID;        }        else        {            var=pile[var].pointer[id];            if(pile[var].vis!=ID)///vis不等于当前的ID,说明不是字串。            {                pile[var].value++;                pile[var].vis=ID;            }        }    }}int Search(char *s)///搜索{    int var=0;    int len=strlen(s);    for(int i=0;i<len;i++)    {        if(pile[var].pointer[s[i]-'a']==0)        {            return 0;        }        var=pile[var].pointer[s[i]-'a'];    }    return pile[var].value;}int main(){    int p;    cin>>p;    char s[55];    while(p--)    {        scanf("%s",s);        for(int i=0;i<strlen(s);i++)            Build(s+i,p);///将该字符的编号做为标记    }    int q;    cin>>q;    while(q--)    {        scanf("%s",s);        cout<<Search(s)<<endl;    }}
原创粉丝点击