码迷,mamicode.com
首页 > 其他好文 > 详细

LA3026 周期 (kmp)

时间:2020-07-03 23:14:50      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:cond   长度   std   cstring   string   选择   queue   ret   while   

题目描述

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

分析

因为重复这个概念我们在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\n",++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)

标签:cond   长度   std   cstring   string   选择   queue   ret   while   

原文地址:https://www.cnblogs.com/hhlya/p/13233085.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!