【BZOJ3670】【NOI 2014】动物园(KMP)

2023-11-07 19:08
文章标签 kmp noi 2014 动物园 bzoj3670

本文主要是介绍【BZOJ3670】【NOI 2014】动物园(KMP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3670
题解
以前写过一次但不是很懂,所以重新写了一下
首先构造一个cnt数组表示前缀等于后缀的子串的数目
那么cnt【i】=cnt【next【i】】+1,可以在求next同时求出来
cnt【1】=1 // 只有它本身
求 num【i】时只需找到第一个长度小于 i / 2 的子串即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MOD 1000000007
using namespace std;
int nxt[1000001],cnt[1000001],len;
int main()
{int T;int j,p; scanf("%d",&T);char s[1000001];while(T--){cnt[1]=1;j=0;scanf("%s",s+1);len=strlen(s+1);long long ans=1;for(int i=2;i<=len;i++){while(j&&s[j+1]!=s[i]) j=nxt[j];j+=(s[j+1]==s[i]);p=nxt[i]=j;cnt[i]=cnt[j]+1;while(2*p>i) p=nxt[p];ans=ans*(cnt[p]+1)%MOD;}printf("%lld\n",ans);}
}

但是这个会TLE
因为在找第一个不重叠子串的时候是O(n)的
所以类比KMP算法中的步骤
可以近似O(1)的得到这个位置

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long longconst int N=1000100;
const int mod=1e9+7;int nxt[N],cnt[N];
LL num[N];void Get_nxt(char *s,int nxt[])
{int lens=strlen(s+1);int j=0;nxt[1]=0;cnt[1]=1;for(int i=2;i<=lens;i++){while(j&&s[j+1]!=s[i]) j=nxt[j];j+=(s[j+1]==s[i]);nxt[i]=j; cnt[i]=cnt[nxt[i]]+1;}
}LL KMP(char *s)
{LL ans=1;int j=0;int lens=strlen(s+1);for(int i=2;i<=lens;i++){while(j&&s[j+1]!=s[i]) j=nxt[j];j+=(s[j+1]==s[i]);while((j<<1)>i) j=nxt[j];ans=(ans*(cnt[j]+1))%mod;}return ans;
}int main()
{int T;char s[N];cin>>T;while(T--){scanf("%s",s+1);Get_nxt(s,nxt);printf("%lld\n",KMP(s));}return 0;
}

这篇关于【BZOJ3670】【NOI 2014】动物园(KMP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365678

相关文章

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

codeforces535D:Tavas and Malekas(KMP)

(i-1 , i)有重合的时候 ,从第i位开始的子串必须是模式串的前缀。 而同时,从第i位开始的子串本来就已经是模式串的后缀了。 typedef long long LL ;const int maxn = 1000008 ;int next[maxn] ;void getnext(char s[]){int len = strlen(s) ;next[0] = -1 ;i

fzu 2275 Game KMP

Problem 2275 Game Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number i

2014年暑假培训 - 数论

A银河上的星星 /**************************************************************     Problem: 1014     User: DoubleQ     Language: C++     Result: Accepted     Time:190 ms     Memor

2014暑假集训搜索专题

A - 漫步校园 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Description LL最近沉迷于AC不能自拔,每天寝室、机房两点一线。由于长时间坐在电脑边,缺乏运动。他决定充分利用每次从寝室到机房的时间,在校园里散散步。整个HDU校园呈方形布局,可划

[置顶] 2014训练计划进阶版

动态规划: 区间dp,树状dp,数位dphdu3555, sgu258, sgu390  队列优化: zoj3399 最小表示法的状态压缩DP: spoj2159  专题链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=38881#overview 专题链接: http://acm.hust.edu.cn/vjudg

[置顶] 2014训练计划

每个专题结束后会有5小时的专题赛~ 1、hustOJ目前支持谷歌、火狐浏览器等部分浏览器。 2、欢迎吐槽~ 3、推荐该阶段用书(以下具体算法实现多数可在此书中找到详解):算法竞赛入门经典之训练指南(刘汝佳) 4、题解报告:专题中的题目多是经典题目,百度搜索即有详细解答~ 5、专题相关知识点红字标出,建议先百度红字部分,有助于专题学习~ 6、专题时间会在"ACM 今天你AC了吗?"(12