Cyclic Nacklace 杭电3746
CC always becomes very depressed at the end of this month,he has checked his credit card yesterday,without any surprise,there are only 99.9 yuan left. he is too distressed and thinking about how to tide over the last days. Being inspired by the entrepreneurial spirit of "HDU CakeMan",he wants to sell some little things to make money. Of course,this is not an easy task.
?
?
Input
The first line of the input is a single integer T ( 0 < T <= 100 ) which means the number of test cases.
Each test case contains only one line describe the original ordinary chain to be remade. Each character in the string stands for one pearl and there are 26 kinds of pearls being described by ‘a‘ ~‘z‘ characters. The length of the string Len: ( 3 <= Len <= 100000 ).
?
Output
For each case,you are required to output the minimum count of pearls added to make a CharmBracelet.
?
Sample Input
3
aaa
abca
abcde
?
Sample Output
0
2
5
题目大意:就是给你一个字符串,让你判断最少加上多少个字符才能使其完美匹配
用到的知识:KMP,还有就是最小循环长度等于总长度减去next[n-1](从0计数)
#include<cstdio> #include<iostream> #include<string> #include<cstring> using namespace std; typedef long long ll; const int N=1E6+7; char arr[N]; ll nxt[N]; //abcdefabcdefab //总长度n减去nxt[n-1]就是循环节的最短长度 int main(){ int t; scanf("%d",&t); while(t--){ scanf("%s",arr); ll n=strlen(arr); for(ll i=1;i<n;i++){ ll j=nxt[i-1]; while(arr[i]!=arr[j]&&j>0) j=nxt[j-1]; if(arr[i]==arr[j]) j++; nxt[i]=j; } int len=n-nxt[n-1]; if(len==n) printf("%dn",len); else if(n%len==0){ puts("0"); } else printf("%dn",len-n%len); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |