【洛谷 P2375】 【kmp】 动物园
题目
解题思路
学过kmp的小朋友们肯定知道next维护的是既是它前缀又是它后缀的长度
题目讲的一级棒
那么我们可以从这推出一个弱化版的num
num求的是不重叠的又是前缀又是后缀的长度
设一个ans求的是可重叠的又是前缀又是后缀的长度
求ans[i]即是ans[next[i]]+1
next[i]本身就既是它的前缀也是它的后缀,所以next[i]的前缀也会是i的前缀
因为最后num求的是不重叠的
所以我们要保证k 就是i最长的一个不重叠前缀的长度
那么可以用求next时的方法一直往前跳,直到小于i的一半
最后求ans[k]+1与答案相乘 +1是因为它本身也是i的前缀
题目要求的是所有(num+1)的乘积,为了不用每次再加1,给ans[1]初值为1
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int mo=1000000007;
char s[1000010];
int n,len,ans[1000010],next