可以将n个数后面再接n个数就变成nn个数然后以每个数为开头的组最远能到哪也是很容易求的O(n)维护个指针可以处理。把远的位置视为跳一步能到的吧这样问题就转化为1到n中的第i个数至少到第ni个数要跳多少次。这个如果是一般图的话就是类似树上求k步的祖先在哪可以用倍增法n*log(n)。但是这题图比较特殊i http://codeforces.com/contest/526/problem/D 想起D题也不错虽然比赛时秒了但是是基于我对KMP的理解的基础上的- -。i-p[i]为从字符串起始位置到当前i位置的循环节就是说di-p[i]每d个字符为一段循环。现在面试题好多想考察KMP起始都能用hash之类的做都不是真正的KMP题。 还有扩展KMP是向后的这个不熟敲不出来只会二分hash多个logn的复杂度。 #include#include#include#include#include#include#include#include#includeusing namespace std;#define mp(x,y) make_pair(x,y)typedef pair per;typedef long long ll;const int MOD 1000000007;const int N 1000005;int pt[NN],a[NN],n,f[NN],cnt[NN];ll d;void got(){ int i,j1; ll sum0; for(i1;i 转:https://www.cnblogs.com/seen1020/p/4394145.html