给定一个字符串,求需要添加至少几个字符到字符串末尾才能使得整个字符串串由某一个不为本身的子串循环构成?
如"abca",添加"bc"后构成"abcabc",其由子串"abc"循环构成;也可以添加"abca"后构成"abcaabca",其由子串"abca"循环构成,相比之下"bc"只有2个字符,添加的字符量最少。
标签:name 一个 ext circle 字符串 ios 循环 def code
给定一个字符串,求需要添加至少几个字符到字符串末尾才能使得整个字符串串由某一个不为本身的子串循环构成?
如"abca",添加"bc"后构成"abcabc",其由子串"abc"循环构成;也可以添加"abca"后构成"abcaabca",其由子串"abca"循环构成,相比之下"bc"只有2个字符,添加的字符量最少。
第一行包括一个整数T(1 <= T <= 100),代表测试组数
每组测试数据包括一行字符串,其长度范围为 [3, 104]
对于每组测试数据
输出一个整数N,代表添加的最小字符数量
#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; }
标签:name 一个 ext circle 字符串 ios 循环 def code
原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12180770.html