码迷,mamicode.com
首页 > 其他好文 > 详细

子串循环问题 (Ver. I)

时间:2020-01-11 19:59:54      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:name   一个   ext   circle   字符串   ios   循环   def   code   

题目描述

给定一个字符串,求需要添加至少几个字符到字符串末尾才能使得整个字符串串由某一个不为本身的子串循环构成?
如"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)

标签:name   一个   ext   circle   字符串   ios   循环   def   code   

原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12180770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!