zoukankan      html  css  js  c++  java
  • BZOJ3670: [Noi2014]动物园

    【传送门:BZOJ3670


    简要题意:

      给出一个st字符串,定义一个sum数组,sum[i]表示st[1...i]中,所有前缀和后缀不重叠的情况下,前缀和后缀相等的数量,比如说st='aaaaa',sum[5]=2,因为st[1]=st[len],st[1...2]=st[len-1...len],所以有两个,求出(sum[1]+1)*(sum[2]+1)*(sum[3]+1)*...*(sum[n]+1),答案要%10^9+7


    题解:

      原题就告诉了你KMP这个算法,就用KMP来做这道题(仅此题,别的不一定,比如说某省选的一道题上说,考整体二分套可持久化平衡树,结果不是)

      首先像平时求kmp一样求p数组,然后定义一个dep数组,dep[i]表示p[i]是经过多少次向前继承得到的(有点绕口,但是很重要!要理解好),并且我们设如果p[i]=0时,dep[i]=1,比如说st='abcababc',p数组=0 0 0 1 2 1 2 3,dep数组=1 1 1 2 2 2 2 2,求出dep有什么用呢?

      dep就是sum数组的雏形,它表示所有前缀和后缀相等的数量,有可能有重叠的前缀和后缀,也有可能就是整个子串,所以为什么p[i]=0时,dep[i]=1

      接下来就是要得出正确的dep数组,其实怎么来求呢,操作其实和求p数组的操作相似,不过一开始要先将j变为长度小于等于i/2,因为不能重叠,然后ans直接在每一次操作中操作


    参考代码:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    char st[1100000];
    LL dep[1100000];
    LL p[1100000];
    LL sum[1100000];
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%s",st+1);
            int len=strlen(st+1);
            LL ans=1;
            memset(p,0,sizeof(p));
            memset(sum,0,sizeof(sum));
            memset(dep,0,sizeof(dep));
            dep[1]=1;
            for(int i=2;i<=len;i++)
            {
                int j=p[i-1];
                while(st[j+1]!=st[i]&&j!=0) j=p[j];
                if(st[j+1]==st[i]) j++;
                p[i]=j;
                dep[i]=dep[j]+1;
            }
            int j=0;
            for(int i=2;i<=len;i++)
            {
                while((j+1)*2>i) j=p[j];
                while(j!=0&&st[i]!=st[j+1]) j=p[j];
                if(st[i]==st[j+1]) j++;
                ans=(ans*(dep[j]+1))%1000000007;
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }

     

  • 相关阅读:
    使用 Rust 编写更快的 React 组件
    快速入门 postcss 插件:自动转换 px 到 rem
    通过实战理解CPU上下文切换
    “web资源加载优先级”原来能这么精准控制
    使用Brotli提高网站访问速度
    使用 npm shrinkwrap 来管理项目依赖
    如何用“底层逻辑”,看清世界的底牌?
    Node.js 应用全链路追踪技术——全链路信息获取
    解决 Elastic Search 的深分页问题
    Whistle 实现原理 —— 从 0 开始实现一个抓包工具
  • 原文地址:https://www.cnblogs.com/Never-mind/p/7865849.html
Copyright © 2011-2022 走看看