动物园

给定一个长为\(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. php json josn_decode()返回的是对像,如何把对像转成数组

    php json josn_decode()返回的是对像,如何把对像转成数组 a.php传值页面,使用 json_encode($array)对数组进行加密码. b.php页面在接收a.php传过来的 ...

  2. 为用户管理连接 Confluence 6 到 Jira 应用程序

    请注意,在使用这个功能的时候,你的 Jira 应用许可证数量和 Confluence 的许可证数量不需要完全等同.例如,你可以通过 Jira 管理一个 50 个用户的 Confluence 许可证,尽 ...

  3. LTE时代的定位技术:OTDOA,LPP,SUPL2.0

    LTE时代的定位技术:OTDOA,LPP,SUPL2.0 移动定位技术的发展历程 如今智能手机已经在整个社会普及,数量众多的手机应用成为了人们生活当中不可或缺的一部分.越来越多的手机应用都用到了手机定 ...

  4. 悟空CRM框架下载模板

    1.你可以把你要下载的模板放在这个项目的Public/excelmodel目录下,然后你就可以在页面中编写代码 你可以在下载按钮这里编写:onclick="window.location.h ...

  5. nyoj1272表达式求值(递归法)

    递归写的,类似于之前的一道,但要更难一点,因为加入了'+','*'以及括号运算符,所以要考录周全: 这道题给了我很大启示,在第一道德基础上: 1!寻找括号的优先级,先找有没有不被任何括号夹住的加号,如 ...

  6. dp练习(2)——老鼠的旅行

    1267 老鼠的旅行(来源:codevs) #include "bits/stdc++.h" using namespace std; ][]; ][]; int main() { ...

  7. 生成输出 URL(16.2)

    1.在视图中生成输出 URL 几乎在每一个 MVC 框架应用程序中,你都会希望让用户能够从一个视图导航到另一个视图 —— 通常的做法是在第一个视图中生成一个指向第二个视图的链接,该链接以第二个视图的动 ...

  8. EBS Workflow参考资料

    参考资料: How to send an email from oracle workflow process using an AdHocRole? Notification System APIs ...

  9. OC Copy自定义类

  10. duilib CEditUI 禁止输入中文字符,禁止复制粘贴

    1.CEditUI 禁止使用中文输入法 在 CEditUI::DoEvent 函数中,添加代码: if(m_bOnlyEnglishChar && m_pWindow &&am ...