• hdu 3746 kmp求循环节 下标从1开始


    长度为m[1,2...m]的模式的循环节为 m-next[m] ,

    aaa  循环节clc为1  (clc=m-next[m]= 3-2  =1)       此时   m%clc == 0   表示有3个完整的循环节

    ababa    循环节为2 (clc = 5-3=2)         此时   m%clc = 5%2 =1     表示有两个循环节 还余一个数  ,需添加的字符数 为  len - m%clc

    abaed 循环节为 5   (clc = 5-0=5)     此时, clc = m   表示只有一个完整的循环节 ,如果至少要两个循环节的话 ,需添加的字符数 为 len

    下表从1 开始的代码如下:

    #include<iostream>
    #include<stdio.h>
    #include<string>
    #include<string.h>
    #define N 100005
    using namespace std;
    char P[N];
    int m;
    int next[N];
     void Prefix_Func()
     {
         int i,k;
         k=0;
         next[1]=0;
         for(i=2;i<=m;i++)
         {
            while(k>0 && P[k+1]!= P[i])
                k=next[k];
            if(P[k+1] == P[i])
                k++;
            next[i]=k;
         }
     }
    int main()
    {
        int t,clc;
        cin>>t;
        while(t--)
        {
            scanf("%s",P+1);
            m=strlen(P+1);
            Prefix_Func();
            clc=m-next[m];
            if(clc==m)  cout<<m<<endl;
            else if(m%clc== 0) cout<<"0"<<endl;
            else
            {
                cout<<clc-m%clc<<endl;
            }
    
        }
        return 0 ;
    }
  • 相关阅读:
    hdoj-1004-Let the Balloon Rise(水题)
    hdoj-1827-Summer Holiday(scc+缩点)
    poj--3624--Charm Bracelet(动态规划 水题)
    HDU
    HDU
    HDU
    HDU
    【POJ1654】Area【叉积】
    【POJ1654】Area【叉积】
    【SSLOJ1715】计算面积【叉积】
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3571284.html
Copyright © 2020-2023  润新知