子串循环问题 (Ver. I)

Posted szu-ds-wys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子串循环问题 (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;
}

以上是关于子串循环问题 (Ver. I)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1358

[程序员代码面试指南]字符串问题-回文最少分割数(DP)

[PHP]算法-最长公共子串的PHP实现

第二次作业

母串中有几个相同的子串

poj3693-重复次数最多的连续重复子串后缀数组