LG2375 [NOI2014]动物园
动物园
给定一个长为\(L\)的字符串(\(L \leq 1e6\))
求一个\(num\)数组,\(num[i]\)表示长度为\(i\)的前缀中字符串\(S’\)的数量,其中\(S‘\)既是该前缀的前缀也是该前缀的后缀,且\(2|S'| \leq i\)
分析
用kmp算法,\(num[i]\)其实就是\(i\)在\(f\)中跳,值小于\(i/2\)的个数。然而直接这样求是\(O(n^2)\)的,因为可以造一个全a串,然后\(f\)都是前一个\(f\)加\(1\).
kmp的精髓是继承,那这道题可否继承?显然可以。
对于\(i\)位置满足条件的\(S’\),\(i+1\)位置满足条件的\(S’’\)其实是在S’的基础上至多多了一个字符。
先求出不加限制的\(num\)数组,注意到对于\(i\)它的\(num\)至少为\(1\)因为要考虑它本身。然后\(num[0]\)要赋成0,因为后面计算的时候转移到0肯定是无法匹配,值应该为\(1\),并且\(num[0]\)是肯定不会算入答案的。然后求答案时维护\(j\)不超过\(i\)的一半就行了。
时间复杂度\(O(n)\)。
har s[1000010];
int f[1000010];
int num[1000010];
int main()
{
int T;
read(T);
while(T--)
{
scanf("%s",s);
int n=strlen(s);
f[0]=0,f[1]=0;
num[0]=0,num[1]=1; // 不加限制的num数组
int j=0;
for(int i=1;i<=n;++i)
{
while(j&&s[i]!=s[j])
j=f[j];
j+=(s[i]==s[j]);
f[i+1]=j,num[i+1]=num[j]+1; // 值要加1是因为它本身也要计算
}
j=0;
int ans=1;
for(int i=0;i<n;++i)
{
while(j&&s[i]!=s[j])
j=f[j];
j+=(s[i]==s[j]);
while((j<<1)>(i+1))
j=f[j];
ans=(ll)ans*(num[j]+1)%mod;
}
printf("%d\n",ans);
}
return 0;
}
Hint
其实我觉得这样写虽然很简洁,但是细节较多,不推荐。推荐另一种倍增的写法,把fail数组加一个倍增,这样更直观,但是时间复杂度\(O(n\log n)\).
LG2375 [NOI2014]动物园的更多相关文章
- [BZOJ3670][UOJ#5][NOI2014]动物园
[BZOJ3670][UOJ#5][NOI2014]动物园 试题描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学 ...
- NOI2014 动物园
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 174 Solved: 92[Submit][Status] D ...
- 字符串(KMP):BZOJ 3670 [Noi2014]动物园
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1521 Solved: 813[Submit][Status] ...
- BZOJ 3670: [Noi2014]动物园【KMP变形 】
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2738 Solved: 1475[Submit][Status ...
- BZOJ_3670_[Noi2014]动物园_KMP
BZOJ_3670_[Noi2014]动物园_KMP Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的 ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
- BZOJ3670 [Noi2014]动物园 【KMP计数】
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 3143 Solved: 1690 [Submit][Stat ...
- [洛谷P2375] [NOI2014]动物园
洛谷题目链接:[NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决 ...
- 【bzoj3670】[Noi2014]动物园
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2080 Solved: 1107[Submit][Status ...
随机推荐
- 20170731xlVba根据数据表和模板表生成新表
Public Sub SplitData() Dim Wb As Workbook Dim Sht As Worksheet Dim NewSht As Worksheet Dim arr As Va ...
- Intent在Activity之间传值的几种方式
发这篇博客主要讲一下Android中Intent中如何传值的几种方法: 1:基本数据类型,包含了Java八种基本数据类型和CharSequece文本2:八种数据类新对应数组和CharSequece文本 ...
- Java数组常用API
java.util.Arrays Arrays.asList() 数组转换成列表 String[] strArray = {"zhang", "xue", &q ...
- windows下面使用nginx配置web注意问题
1.路径一定要用两个反斜杠进行转义,如果只用单个反斜杠,遇到\n就识别不到路径了,例如下图中的\news中包含\n
- 快照库MV不能成功刷新问题的解决
前几天,一个用户找到我,说他们的物化视图不能刷新了,这得从几天前主库的一次意外down机说起(另文说明),前几天,用户现场的一个中心库因某原因意外down掉了,当时短期内对中心库进行了重启修复,没有造 ...
- 微信access_token全局缓存,处理过期
//PHP创建access_token.json文件,将access_token 和 生成时间expires 保存在其中, //{"access_token":"xxxx ...
- EchoService
dubbo为consumer端的代理对象实现了EchoService接口. 使用示例: <dubbo:reference id="hello" interface=" ...
- 信号处理函数的返回sigsetjmp/siglongjmp
由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将 信号屏蔽码修改会原来的屏蔽码,从而引起该信号被永久屏蔽. 可以使用sigsetjmp/s ...
- 微信公众号平台开发(二)信息的分类.md
在上一篇博客中,我们只是简单地与微信服务器建立了连接,接下来就是从微信服务器中接收信息了.在SecurityController中,我定义了两个方法(get和post).Get方法是我们用来与微信服务 ...
- linux processes identifiers
Linux, like all Unix uses user and group identifiers to check for access rights to files and images ...