LA3026 周期 (kmp)

Posted hhlya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LA3026 周期 (kmp)相关的知识,希望对你有一定的参考价值。

题目描述

给你一个字符串,让你判断这个字符串的前缀是不是由一个字串重复而组成的,如果有求出所有前缀串的长度和重复次数。

分析

因为重复这个概念我们在kmp算法里面提到过,next数组,有印象么,那么根据后缀函数的定义我们把这个串往后移,错位部分的长度就等于i-f[i],f数组就相当于与kmp里面的next数组,因为我们所选择的这个数组前缀要由这个重复的部分组成,那么我们可以知道,如果i%(i-f[i])==0那么这个长度的前缀就符合题意。

代码实现

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <numeric>
#include<vector>
#include <functional>
#define x first
#define y second 
using namespace std;
typedef long long ll;
const int maxn=1000000+10;
char p[maxn];
int f[maxn];
int main() {
   int n,kcase=0;
   while (cin>>n&&n) {
      cin>>p;
      f[0]=f[1]=0;
      for (int i=1;i<n;i++) {
         int j=f[i];
         while (j&&p[i]!=p[j]) j=f[j];
         f[i+1]=p[i]==p[j]?j+1:0;
      }
      printf ("Test case #%d
",++kcase);
      for (int i=2;i<=n;i++) {
         if (f[i]>0&&i%(i-f[i])==0) cout<<i<<" "<<i/(i-f[i])<<endl;
      }

   }
   return 0; 
}


以上是关于LA3026 周期 (kmp)的主要内容,如果未能解决你的问题,请参考以下文章

UVALive 3026

UVAlive 3026 KMP 最小循环节

POJ1961最短周期串/最大周期 kmp

Period UVALive - 3026(next数组)

bzoj 3620 暴力KMP

POJ--2406Power Strings+KMP求字符串最小周期