p1366上字典树水过

  虽然写着AC自动机,但是我寻思着m*maxlen也能写啊为啥写的人这么少?

  对于所有的单词可以建立一个字典树,小小的改动就是把单词的结尾记录sum++,然后枚举开头能跳的话就向下跳,如果跳到一个地方发现sum!=0显然可以ans+=sum,sum=0;

  <=50*1000000AC,甚至比康神AC自动机跑的快.

  

using namespace std;
struct tree
{
    int head[30],flag;
    char emm;
}e[500010];
int i,f,now,tot,n,len,maxlen,ans;
char tt[60],wu[1001000];
void add(int d,int now)
{
    tt[d]-='a';
    if(!e[now].head[tt[d]])
        tot++,e[now].head[tt[d]]=tot;
    now=e[now].head[tt[d]];
    if(d==len-1)
    {    
            e[now].flag++;
        return ;
    }
    add(d+1,now);
    return ;
}
int main()
{
    scanf("%d
",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%s",tt);
        len=strlen(tt);
        maxlen=max(maxlen,len);
        add(0,0);
    }
    scanf("%s",wu);
    len=strlen(wu);
    for(i=0;i<len;i++)//枚举开头
    {
        for(now=0,f=i;;f++)
        {
            if(e[now].head[wu[f]-'a'])//往下跳
                now=e[now].head[wu[f]-'a'];
            else
                break;
            if(e[now].flag)
                ans+=e[now].flag,e[now].flag=0;//统计答案
        }
    }
    cout<<ans;
    return 0;
}
23333
原文地址:https://www.cnblogs.com/qywyt/p/10256095.html