• 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; 
    }
    
    
    
  • 相关阅读:
    设计模式之Flyweight模式(笔记)
    【leetcode】Valid Sudoku
    POJ2369 Permutations【置换群】
    Linux下无需输入password自己主动登陆sshserver方法
    HDU 1847 Good Luck in CET-4 Everybody!(找规律版巴什博奕)
    HDU 4786Fibonacci Tree(最小生成树)
    次小生成树
    洛谷P4180 [Beijing2010组队]次小生成树Tree
    MatrixTree速成
    SP104 HIGH
  • 原文地址:https://www.cnblogs.com/hhlya/p/13233085.html
Copyright © 2020-2023  润新知