zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    20200116
    20200115
    20191214数组之四:数字不相同的完全平方数(关于数位上数字判断与sprintf)
    结构体与C++sort()函数的用法
    字符串常用函数
    sscanf用法
    螺旋矩阵
    模m的k次根
    梅森素数与完全数
    bit_reverse_swap
  • 原文地址:https://www.cnblogs.com/qywyt/p/10256095.html
Copyright © 2011-2022 走看看