zoukankan      html  css  js  c++  java
  • HDU 3746 Cyclic Nacklace(KMP+最小循环节)题解

    思路:

    最小循环节的解释在这里,有人证明了那么就很好计算了

    之前对KMP了解不是很深啊,就很容易做错,特别是对fail的理解

    注意一下这里getFail的不同含义

    代码:

    #include<iostream>
    #include<algorithm>
    const int N = 1000000+5;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    int fail[N];
    char p[N],t[N];
    void getFail(){
         fail[0] = -1;
         int j = 0,k = -1;
         int len = strlen(p);
         while(j <= len){   //给等号
            if(k == -1 || p[j] == p[k]){
                if(p[++j] == p[++k])
                    fail[j] = fail[k];
                else
                    fail[j] = k;
            }
            else{
                k = fail[k];
            }
         }
    }
    int KMP(){
        int num = 0;
        getFail();
        int i = 0,j = 0;
        int lent = strlen(t),lenp = strlen(p);
        while(i < lent){
            if(j == -1 || t[i] == p[j]){
                i++;
                j++;
                if(j == lenp) num++;
            }
            else{
                j = fail[j];
            }
        }
        return num;
    }
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            scanf("%s",p);
            getFail();
            int len = strlen(p);
            int c = len - fail[len];    //最小循环节
            if(len % c == 0){
                if(len == c) printf("%d
    ",c);
                else printf("0
    ");
            }
            else{
                printf("%d
    ",c - len%c);
            }
        }
        return 0;
    }
    


  • 相关阅读:
    17.10.13
    17.10.12
    17.10.11
    17.10.10
    17.10.05
    17.10.04
    17.10.03
    17.10.02
    17.10.01
    17.9.29
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9408775.html
Copyright © 2011-2022 走看看