子串循環問題 (Ver. I)


題目描述

給定一個字符串,求需要添加至少幾個字符到字符串末尾才能使得整個字符串串由某一個不為本身的子串循環構成?
如"abca",添加"bc"后構成"abcabc",其由子串"abc"循環構成;也可以添加"abca"后構成"abcaabca",其由子串"abca"循環構成,相比之下"bc"只有2個字符,添加的字符量最少。

輸入

第一行包括一個整數T(1 <= T <= 100),代表測試組數

每組測試數據包括一行字符串,其長度范圍為 [3, 104]

輸出

對於每組測試數據

輸出一個整數N,代表添加的最小字符數量

樣例輸入

3 aaa abca abcdefg

樣例輸出

0 2 7

提示

#include<iostream>
#include<string>
using namespace std;
int *getnext(string p)
{
    int j=0,k=-1;
    int *next=new int[p.size()+1];
    next[0]=-1;
    while(j<(int)p.size())
    {
        if(k==-1||p[j]==p[k])
        {
            j++;
            k++;
            next[j]=k;
        }
        else
            k=next[k];
    }
    return next;
}
 
int KMP(string s,string p)
{
    int i=0,j=0;
    int *next=getnext(p);
    while(i<(int)s.size()&&j<(int)p.size())
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else
            j=next[j];
    }
    if(j==(int)p.size())
        return i-j+1;
    return 0;
}
 
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        string p;
        cin>>p;
        int *next=getnext(p);
        int len=p.size();
        int circlelen=len-next[len];
        int uplen=circlelen-len%circlelen;
        if(circlelen!=len&&len%circlelen==0)
            uplen=0;
        cout<<uplen<<endl;
    }
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM