动物园

给定一个长为\(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. .net GUI框架

    十大开源的.NET用户界面框架 让GUI设计不再犯难 选择一款合适的GUI框架是.NET开发中比较重要但又很棘手的问题,因为用户界面相当于一款应用的"门面",直接面向用户.好的UI ...

  2. 20161212xlVBA工作表数据整理合并单元格

    Sub NextSeven_CodeFrame() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAlerts = Fal ...

  3. Confluence 6 选项 2 – 转移 Crowd/Jira 应用程序中的用户和用户组到 Confluence 数据库

    当你打算合并的外部目录服务器(Crowd 或 Jira 应用)有大量的用户到 Confluence 数据库中的时候,请使用这个选项.你需要有基本的 SQL 知识才能完成这个任务. 下面的 SQL 命令 ...

  4. Ivan and Burgers CodeForces - 1100F (线性基)

    大意: 给定n元素序列, m个询问$(l,r)$, 求$[l,r]$中选出任意数异或后的最大值 线性基沙茶题, 直接线段树暴力维护两个log还是能过的 #include <iostream> ...

  5. iterator not dereferencable问题

    STL中的迭代器总是出现各种问题,这个是我在打表达式求值时碰到的... 综合网上的答案,一般来说有两种情况: 第一:访问了非法位置. 一般来说可能在queue为空时取front(),rear(),或者 ...

  6. Mysql/Mariadb 升级注意事项

    因需要使用到分区表,在业务不中断的情况下,可以新增分区,需要将原来的Mariadb10.1.25版本升级到Mariadb10.3.8. 1.升级步骤如下 1)新搭建Mariadb10.3.8版本的DB ...

  7. python 安装包查看

    pip freeze可以查看已经安装的python软件包和版本 pip list 也可以

  8. ansible 删除路径下的多个文件[收集的参考]

    How to delete multiple files / directories in Ansible ansible - find, file modules to delete files a ...

  9. Chrome 应用推荐 - Shortcuts for Google™ 3.4.1

    Choose from 200+ Google™ services to show up as buttons in a space-saving popup. Official Firefox ex ...

  10. Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException

    最近在使用poi操作excel时发现一个问题,详细如下: Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethod ...