1328 - Period(失配函数使用)

这个题目是让找串上每个前缀串的最小周期,若周期大于2,输出该点,和周期个数。

数据范围 n <= 1e6;

可以先求失配数组,然后对任一点,若在该点失配,下一次的和自己最近匹配为f[i+1], 若要构成周期只需   (p+1)% (p+1)-f[i+1]) == 0; 即可(可以画图证明)这样可o(n)的判断。

#include 
#include 
#include 
#include 
using namespace std;

const int maxn = 1101011;
char str[maxn],src[maxn];
int f[maxn];
void get_fail(char* P){
  int m = strlen(P);
  f[0] = f[1] = 0;
  for(int i=1;i




你可能感兴趣的:(字符串匹配,--,KMP)