BZOJ3670 NOI2014 动物园 题解&代码
来源:互联网 发布:浙江大学软件学院面试 编辑:程序博客网 时间:2024/05/21 06:12
利用了kmp的next数组特性,求出既是i位字符串的前缀又是其后缀的字符串个数num[i],然后按表达式求出积即可
首先进行统计,在求next的时候就可以统计出num[i]了【对于每一个p=next[i],num[i]满足num[i]=num[p]+1(即对于i位字符串,一定有p位字符串满足条件,于是加上p位字符串的num值,和求next[]的思路相似)】。
最后再次进行枚举,此时对于每一位next[]如果其大于长度的一半,那么递归求出下一个满足条件的next[],ans与新的next[]对应的位置的cnt[]+1相乘,得到答案。
求cnt的时候可以直接顺便算出ans…我傻了,没反应上来,写了两遍枚举
#include<iostream>#include<cstdio>#include<cstring>#define LL long long#define MOD 1000000007using namespace std;const int maxn=1000005;int T,next[maxn],cnt[maxn];char s[maxn];LL ans=1;void getnext(void){ int p=0; cnt[1]=1; for(int i=2;s[i];i++) { while(p && s[p+1]!=s[i])p=next[p]; if(s[p+1]==s[i])p++; next[i]=p; cnt[i]=cnt[p]+1; }}void getnum(void){ int p=0; for(int i=2;s[i];i++) { while(p && s[p+1]!=s[i])p=next[p]; if(s[p+1]==s[i])p++; while(p*2-i>0)p=next[p]; ans*=cnt[p]+1; //cout<<p<<' '<<cnt[p]<<endl; ans%=MOD; }}int main(void){ scanf("%d",&T); while(T--) { ans=(LL)1; scanf("%s",s+1); //cout<<n<<endl; getnext(); getnum(); printf("%lld\n",ans); } return 0;}
0 0
- BZOJ3670 NOI2014 动物园 题解&代码
- BZOJ3670 [Noi2014]动物园
- bzoj3670: [Noi2014]动物园 KMP
- 【KMP】[Noi2014] bzoj3670 动物园
- [BZOJ3670][Noi2014]动物园 && KMP
- [BZOJ3670]NOI2014动物园|KMP
- [BZOJ3670][Noi2014]动物园
- bzoj3670 [Noi2014]动物园 kmp
- [BZOJ3670] [Noi2014]动物园
- bzoj3670:NOI2014 动物园
- 【bzoj3670】[Noi2014]动物园 KMP
- BZOJ3670: [Noi2014]动物园
- bzoj3670动物园【NOI2014】
- bzoj3670【NOI2014】动物园
- bzoj3670 Noi2014动物园 - exkmp
- NOI2014 CodeVS3319 Bzoj3670 动物园
- 【bzoj3670】 [NOI2014]动物园
- bzoj3670 NOI2014 动物园 kmp
- Webrtc服务器搭建
- 2820: YY的GCD 莫比乌斯反演
- Windows下配置Nginx和PHP7
- 机器学习实战-逻辑回归
- Matlab中图像梯度的计算方式
- BZOJ3670 NOI2014 动物园 题解&代码
- 基础的排序C++实现
- Spring注解解析
- Android Studio ——Service的生命周期
- APP测试之找回密码
- C++第1次实验
- 树,二叉树的一些基础知识以及二叉树的建立,存储操作
- Eclipse 配置tomcat 不带项目名称
- 【慕课笔记】第六章 JAVA中的集合框架(下) 第6节 尝试对学生序列排序