UOJ #5 [NOI2014 D2T1] 动物园
来源:互联网 发布:论文数据伪造 编辑:程序博客网 时间:2024/05/16 18:53
近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的园长决定开设算法班,让动物们学习算法。 某天,园长给动物们讲解KMP算法。
园长:“对于一个字符串
熊猫:“对于字符串
园长:“非常好,那你能举个例子吗?”
熊猫:“例如
园长表扬了认真预习的熊猫同学。随后,他详细讲解了如何在
最后,园长给出了奖励条件,第一个做对的同学奖励巧克力一盒。听了这句话,睡了一节课的企鹅立刻就醒过来了。但企鹅并不会做这道题,于是向参观动物园的你寻求帮助。你能否帮助企鹅写一个程序求出num数组呢?
特别地,为了避免大量的输出,你不需要输出num[i]分别是多少,你只需要输出
其中
输入格式
输入文件的第1行仅包含一个正整数
表示测试数据的组数。 随后
每组测试数据仅含有一个字符串
输出格式
输出文件应包含
每行描述一组测试数据的答案
答案的顺序应与输入数据的顺序保持一致。对于每组测试数据,仅需要输出一个整数,表示这组测试数据的答案对1000000007取模的结果。
输出文件中不应包含多余的空行
样例一
input
3aaaaaababcababc
output
36132
样例二
见“样例数据下载”
限制与约定
时间限制:
空间限制:
下载
样例数据下载
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~KMP变形~
首先用正常的KMP求出没有不重复的限制的答案num,然后,用k2记录目前不重复的位置,如果重复,就向next跳。和KMP非常像。
#include<cstdio>#include<cstring>#include<iostream>using namespace std;#define ll long longconst int mod=1000000007;int t,n,next[1000001],num[1000001],ans;char s[1000001];int main(){scanf("%d",&t);while(t--){scanf("%s",s+1);n=strlen(s+1);ans=1;num[1]=1;for(int i=2,k1=0,k2=0;i<=n;i++){while(k1 && s[k1+1]!=s[i]) k1=next[k1];if(s[k1+1]==s[i]) k1++;next[i]=k1;num[i]=num[k1]+1;while(k2 && s[k2+1]!=s[i]) k2=next[k2];if(s[k2+1]==s[i]) k2++;while(k2>i>>1) k2=next[k2];ans=(ll)ans*(num[k2]+1)%mod;}printf("%d\n",ans);}return 0;}
- UOJ #5 [NOI2014 D2T1] 动物园
- [UOJ 5]【NOI2014】动物园:KMP
- UOJ #5. 【NOI2014】动物园 扩展KMP
- 【NOI2014】动物园
- [NOI2014]动物园
- NOI2014 动物园
- 【NOI2014】动物园
- BZOJ3670 [Noi2014]动物园
- bzoj3670: [Noi2014]动物园 KMP
- bzoj 3670 [Noi2014]动物园
- 【KMP】[Noi2014] bzoj3670 动物园
- bzoj 3670: [Noi2014]动物园
- [BZOJ3670][Noi2014]动物园 && KMP
- [BZOJ3670]NOI2014动物园|KMP
- [BZOJ3670][Noi2014]动物园
- bzoj3670 [Noi2014]动物园 kmp
- [BZOJ3670] [Noi2014]动物园
- bzoj3670:NOI2014 动物园
- matlab的Reshape函数实现
- POJ 2886 Who Gets the Most Candies? 线段树单点更新
- D
- 2017暑假七林集训day17
- 剑指offer | 训练题60:序列化二叉树
- UOJ #5 [NOI2014 D2T1] 动物园
- 136. Single Number(C++)
- ZOJ 2671 (线段树+矩阵乘法)
- rem.js
- .NET线程同步之Volatile构造
- ProjectEuler-Problem10-Summation of primes
- Android 屏幕适配
- 复现一个DataGridView仅显示一行且不显式抛异常的Bug
- Linux_7_swap_配置