传送门

KMP好题啊……

题中要求我们求出长度不超过原字符串一般的相同的前后缀的个数。其实这个用做前面几道题的思路大致猜测一下……可以发现,我们只要从这个字符串一直往它的next递归,那么我们就可以获得一系列的公共前后缀,而且只要当next的长度<=原长度的一半的时候答案即合法。(不能继续递归,否则就重复计算了)

每个点可以获取的相同的前后缀个数可以通过kmp预处理出来,我们只要让ans[i] = ans[j]+1,(其中next[i] = j),因为在i向j跳的时候相当于获取了一个长度为j的公共前后缀的贡献。

不过我们如果这样一直递归,遇到无良数据(比如200000个a),你就T飞了,因为每次递归只会减少1的长度。解决的方法是,我们在计算的时候也像KMP一样,每次不更新j的位置,使之一直呆在小于i的一半的位置(因为你肯定是要小于i的一半才合法),这样可以避免许多无用的递归,就可以在线性时间之内求解了。

看一下代码。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')using namespace std;
typedef long long ll;
const int M = 10005;
const int N = 1000005;
const ll mod = 1000000007;int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ans *= 10;ans += ch - '0';ch = getchar();}return ans * op;
}int n,nxt[N],len;
char s[N];
ll cur,ans[N];void getnext()
{int j = 0;rep(i,2,len){while(j && s[j+1] != s[i]) j = nxt[j];if(s[j+1] == s[i]) j++;nxt[i] = j,ans[i] = ans[j] + 1;}
}void clear()
{memset(nxt,0,sizeof(nxt));memset(ans,0,sizeof(ans));cur = 1;
}int main()
{n = read();while(n--){clear();scanf("%s",s+1),len = strlen(s+1);ans[1] = 1,getnext();int j = 0;//rep(i,0,len-1) printf("%d ",nxt[i]);enter;//rep(i,0,len-1) printf("%lld ",ans[i]);enter;rep(i,2,len){while(j && s[i] != s[j+1]) j = nxt[j];if(s[j+1] == s[i]) j++;while(j << 1 > i) j = nxt[j];//  printf("!%d\n",j);cur *= (ans[j] + 1),cur %= mod;}printf("%lld\n",cur);}return 0;
}

转载于:https://www.cnblogs.com/captain1/p/9770007.html

NOI2014 动物园相关推荐

  1. BZOJ3670 [Noi2014]动物园 【KMP计数】

    3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 3143  Solved: 1690 [Submit][Stat ...

  2. P2375 [NOI2014] 动物园 kmp fail指针/倍增

    传送门 文章目录 题意: 思路: 题意: 思路: 由kmpkmpkmp中失配数组nenene的含义我们知道,ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...ne[i],ne ...

  3. bzoj 3670 [NOI2014]动物园

    3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 2032  Solved: 1077 [Submit][Stat ...

  4. bzoj3670 [Noi2014]动物园

    [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MB Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游 ...

  5. bzoj-3670 [Noi2014]动物园

    3670: [Noi2014]动物园 题目链接 时间限制: 10 Sec 内存限制: 512 MB 提交: 3558 解决: 1925 [提交][][] 题目描述 近日,园长发现动物园中好吃懒做的动物 ...

  6. 洛谷P2375 [NOI2014] 动物园 题解

    洛谷P2375 [NOI2014] 动物园 题解 题目链接:P2375 [NOI2014] 动物园 题意: 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物 ...

  7. bzoj 3670: [Noi2014]动物园 kmp与扩展kmp

    bzoj 3670: [Noi2014]动物园容 Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才 ...

  8. BZOJ3670: [Noi2014]动物园

    Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习 ...

  9. [NOI2014]动物园

    嘟嘟嘟 NOI2014水题第二道. 起手暴力,神经兮兮的写了个\(O(Tn ^ 2)\)的双哈希,只得了30分.(5e8开O2果然跑不过去) 昨晚写的暴力,今天又看了看这道题,发现就是求一个点跳多少次 ...

  10. bzoj 3670: [Noi2014]动物园

    Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1407  Solved: 749 [Submit][Status][Discuss] Descrip ...

最新文章

  1. java设计模式---构建者模式
  2. FormData 的使用
  3. 一图看尽全生态, 2018区块链产业云图重磅发布
  4. 获取 iPhone 上联系人姓名、电话、邮件的代码
  5. mac安装hadoop2-client
  6. linux搭建java开发环境_linux中搭建java开发环境
  7. LeetCode 189. 旋转数组(环形替换)
  8. 资源下载| 机器学习经典书籍《统计学习方法》(Python3.6)代码实现(及课件)
  9. 目标检测(Object Detection)综述--R-CNN/Fast R-CNN/Faster R-CNN/YOLO/SSD
  10. Python项目:用微信自动给女朋友每天一句英语问候
  11. 求一个截取字符的正则表达式
  12. MySQL的sql优化
  13. Win10 家庭版找不到 gpedit.msc;win10怎样关闭windows defender
  14. python训练神经网络模型_bp神经网络python 训练
  15. 如何利用RFM模型对客户进行精细化管理
  16. Java:final和内部类
  17. 京东智联云能打破“强者恒强”的定律吗?
  18. 设计图标(logo)
  19. 光敏电阻 的工作原理及应用
  20. 【07月15日】A股滚动市盈率PE最低排名

热门文章

  1. ArcGIS几种数据格式2
  2. lucene创建索引
  3. 修改最低版本minSdkVersion(转)
  4. 计算 1!+2!+3!+……+10!
  5. js在客户端创建文件——ActiveXObject
  6. 处理selinux方法
  7. 配置System Center Data Protection Manager 2007
  8. 贾斯帕马斯基林的故事笔记
  9. 如果你有15M 你会投到那些项目上上面呢?机会-可行性模型帮助你
  10. how to become a good teacher