HDU3746 Cyclic Nacklace KMP找循环节

题意:给你一个字符串,让你求这个字符串变成一个循环节的字符串最少需要添加的字符数目。

思路:说白了就是通过next数组寻找循环节,直接上代码,求循环节部分很显然。

代码如下:

#include <bits/stdc++.h>

using namespace std;

const int maxn=1e5+5;
char p[maxn];
int NEXT[maxn];

void get_NEXT(){
    int k=-1;
    int j=0;
    int n=strlen(p);
    NEXT[0]=-1;
    while(j < n){
        if(k == -1 || p[k] == p[j]){
            k++;
            j++;
            NEXT[j]=k;
        }
        else k=NEXT[k];
    }
}

int main()
{
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--){
        cin>>p;
        get_NEXT();
        int len = strlen(p);
        int l=len - NEXT[len];
        if(l != len && len % l == 0){
            cout<<"0"<<endl;
        }
        else {
            cout<<l-NEXT[len]%l<<endl;
        }
    }
    return 0;
}

你可能感兴趣的:(KMP)