【KMP】BZOJ3670-[Noi2014]动物园

【题目大意】
[依然借用别人的概括]给定一个长为L的字符串(L<=100W),求一个num数组,num[i]表示长度为i的前缀中字符串S’的数量,其中S‘既是该前缀的前缀也是该前缀的后缀,且|S‘|*2<=i
【思路】
KMP中next数组的变形。先算一次next数组和dep数组,其中dep数组表示当前前缀经过j=next[j]可以到达-1,这个值其实就是num数组的雏形。然后再进行一次求解next数组,每次前缀不断进行j=next[j],直到满足|S‘|*2<=i。此时的dep[j]就是当前前缀的num值,由于前一次求解next数组预处理,这个值可以在O(1)时间内求解。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define LL long long
 6 #define mod 1000000007
 7 const int MAXN=1000000+500;
 8 using namespace std;
 9 int n;
10 char p[MAXN];
11 int next[MAXN],dep[MAXN],next2[MAXN];
12 int len;
13
14 void getnext()
15 {
16     int i=0,j=-1;
17     next[i]=j;
18     dep[i]=0;
19     while (i<len)
20     {
21         if (j==-1 || p[i]==p[j])
22         {
23             dep[++i]=dep[++j]+1;
24             next[i]=j;
25         }
26         else j=next[j];
27     }
28 }
29
30 void getans()
31 {
32     LL ans=1;
33     int i=0,j=-1;
34     while (i<len)
35     {
36         if (j==-1 || p[i]==p[j])
37         {
38             i++,j++;
39             while (j!=-1 && (j<<1)>i)
40                 j=next[j];
41             if (j!=-1 && i!=-1) ans=ans*(LL)(dep[j]+1) % mod;
42         }
43         else j=next[j];
44     }
45     printf("%lld\n",ans);
46
47
48 }
49
50 int main()
51 {
52     scanf("%d",&n);
53     for (int i=0;i<n;i++)
54     {
55         scanf("%s",p);
56         len=strlen(p);
57         getnext();
58         getans();
59     }
60     return 0;
61 }
时间: 2024-08-03 03:02:27

【KMP】BZOJ3670-[Noi2014]动物园的相关文章

bzoj3670[Noi2014]动物园

bzoj3670[Noi2014]动物园 题意: 对于字符串S的前i个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i].给出字符串S求所有num[i]+1的乘积模1000000007.字符串长度≤1000000 题解: 先求一遍fail函数,得到数组记为next1,然后再求next2数组,表示满足next1[j]*2≤i的next1[j],这一过程也是可以递推的.同时用cnt数组记录next1[j]有多少个.num[i]就是cnt[nex

[蒟蒻修炼计划][bzoj3670][Noi2014]动物园

Description 已知一个字符串S,对于字符串S的前i个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i]. 求mod 10^9+7. Input 第1行仅包含一个正整数n,表示测试数据的组数.随后n行,每行描述一组测试数据.每组测试数据仅含有一个字符串S,S的定义详见题目描述.数据保证S中仅含小写字母.输入文件中不会包含多余的空行,行末不会存在多余的空格. Output 包含n行,每行描述一组测试数据的答案,答案的顺序应与输入数据的

【bzoj3670】[Noi2014]动物园

3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2080  Solved: 1107[Submit][Status][Discuss] Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法. 某天,园长给动物们讲解KMP算法. 园长:"对于一个字符串S,它的长度

NOI2014 动物园

3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 174  Solved: 92[Submit][Status] Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法. 某天,园长给动物们讲解KMP算法. 园长:“对于一个字符串S,它的长度为L.我们可以在O(L)

【bzoj3670】[Noi2014]动物园 KMP-next数组

题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法. 某天,园长给动物们讲解KMP算法. 园长:“对于一个字符串S,它的长度为L.我们可以在O(L)的时间内,求出一个名为next的数组.有谁预习了next数组的含义吗?” 熊猫:“对于字符串S的前i个字符构成的子串,既是它的后缀又是它的前缀的字符串中(它本身除外),最长的长度记作next[i].” 园长:“非

[BZOJ3670][UOJ#5][NOI2014]动物园

试题描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法. 某天,园长给动物们讲解KMP算法. 园长:“对于一个字符串S,它的长度为L.我们可以在O(L)的时间内,求出一个名为next的数组.有谁预习了next数组的含义吗?” 熊猫:“对于字符串S的前i个字符构成的子串,既是它的后缀又是它的前缀的字符串中(它本身除外),最长的长度记作next[i].” 园长:“非

[bzoj3670] [NOI2014][lg2375] 动物园

nxt数组为KMP的next数组num[i]储存了i前面可以匹配的串的个数.先在KMP求nxt中顺便求出num最后再找到对于i的最大的前后缀不重叠的可匹配的j,ans*=(num[j]+1)%1000000007ans即为答案 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 char s[1000100]; 5 int nxt[1000100],num[1000100],n; 6 long long a

BZOJ 3670 NOI2014 动物园 KMP算法

题意: 给定一个长为L的字符串(L<=100W),求一个num数组,num[i]表示长度为i的前缀中字符串S'的数量,其中S'既是该前缀的前缀也是该前缀的后缀,且|S'|*2<=i 求Π(num[i]+1)%1000000007 这就是KMP算法的一个变形...首先求出next数组,顺便求出cnt数组,代表长度为i的前缀经过几次fix=next[fix]会得到0,然后重新匹配一次,这次注意当fix*2>i的时候令fix=next[fix]即可 这题有坑 切忌用num数组代替next 此外

BZOJ 3670 NOI2014 动物园 KMP+dp

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3670 题意概述:令num[i]表示字符串由1~i的字符形成的前缀中不相重叠的相同前后缀的数量,求mul{ num[i] | 1<=i<=L }mod1000000007. 实际上只要对KMP理解的好这就是个水题,可以想到dp求得num数组,num[i]=num[f[i]]+1,f[i]表示字符串的前缀1~i形成的不重叠的最长相同前后缀长度,如果f[i]的话就不存在.题目的提醒实际上很明

bzoj 3670: [Noi2014]动物园

Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法. 某天,园长给动物们讲解KMP算法. 园长:"对于一个字符串S,它的长度为L.我们可以在O(L)的时间内,求出一个名为next的数组.有谁预习了next数组的含义吗?" 熊猫:"对于字符串S的前i个字符构成的子串,既是它的后缀又是它的前缀的字符串中(它本身除外),最长的长度