动物园

给定一个长为\(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]动物园的更多相关文章

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

    [BZOJ3670][UOJ#5][NOI2014]动物园 试题描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学 ...

  2. NOI2014 动物园

    3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 174  Solved: 92[Submit][Status] D ...

  3. 字符串(KMP):BZOJ 3670 [Noi2014]动物园

    3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1521  Solved: 813[Submit][Status] ...

  4. BZOJ 3670: [Noi2014]动物园【KMP变形 】

    3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2738  Solved: 1475[Submit][Status ...

  5. BZOJ_3670_[Noi2014]动物园_KMP

    BZOJ_3670_[Noi2014]动物园_KMP Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的 ...

  6. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

  7. BZOJ3670 [Noi2014]动物园 【KMP计数】

    3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 3143  Solved: 1690 [Submit][Stat ...

  8. [洛谷P2375] [NOI2014]动物园

    洛谷题目链接:[NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决 ...

  9. 【bzoj3670】[Noi2014]动物园

    3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2080  Solved: 1107[Submit][Status ...

随机推荐

  1. 20170731xlVba根据数据表和模板表生成新表

    Public Sub SplitData() Dim Wb As Workbook Dim Sht As Worksheet Dim NewSht As Worksheet Dim arr As Va ...

  2. Intent在Activity之间传值的几种方式

    发这篇博客主要讲一下Android中Intent中如何传值的几种方法: 1:基本数据类型,包含了Java八种基本数据类型和CharSequece文本2:八种数据类新对应数组和CharSequece文本 ...

  3. Java数组常用API

    java.util.Arrays Arrays.asList() 数组转换成列表 String[] strArray = {"zhang", "xue", &q ...

  4. windows下面使用nginx配置web注意问题

    1.路径一定要用两个反斜杠进行转义,如果只用单个反斜杠,遇到\n就识别不到路径了,例如下图中的\news中包含\n

  5. 快照库MV不能成功刷新问题的解决

    前几天,一个用户找到我,说他们的物化视图不能刷新了,这得从几天前主库的一次意外down机说起(另文说明),前几天,用户现场的一个中心库因某原因意外down掉了,当时短期内对中心库进行了重启修复,没有造 ...

  6. 微信access_token全局缓存,处理过期

    //PHP创建access_token.json文件,将access_token 和 生成时间expires 保存在其中, //{"access_token":"xxxx ...

  7. EchoService

    dubbo为consumer端的代理对象实现了EchoService接口. 使用示例: <dubbo:reference id="hello" interface=" ...

  8. 信号处理函数的返回sigsetjmp/siglongjmp

    由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将 信号屏蔽码修改会原来的屏蔽码,从而引起该信号被永久屏蔽. 可以使用sigsetjmp/s ...

  9. 微信公众号平台开发(二)信息的分类.md

    在上一篇博客中,我们只是简单地与微信服务器建立了连接,接下来就是从微信服务器中接收信息了.在SecurityController中,我定义了两个方法(get和post).Get方法是我们用来与微信服务 ...

  10. linux processes identifiers

    Linux, like all Unix uses user and group identifiers to check for access rights to files and images ...