标签:soft names ted data thinking cli rda important ack
//给你一个字符串,
//要求将字符串的全部字符最少循环2次需要添加的字符数
例如:abca abcabc 然后首尾相连
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define MAX 100010 5 char str1[MAX]; 6 int next[MAX]; 7 void getnext(char b[MAX],int m) 8 { 9 int i=0,j=-1; 10 next[i]=-1; 11 while(i<m) 12 { 13 if(j==-1||b[j]==b[i]) 14 {i++; 15 j++; 16 next[i]=j; 17 } 18 else 19 j=next[j]; 20 } 21 } 22 int main() 23 { 24 int len,t; 25 int l; 26 scanf("%d",&t); 27 while(t--) 28 { 29 memset(next,0,sizeof(next)); 30 scanf("%s",str1); 31 len=strlen(str1); 32 getnext(str1,len); 33 l=len-next[len]; 34 if(len==l) 35 printf("%d\n",len); 36 else 37 { if(len%l==0) 38 printf("0\n"); 39 else 40 printf("%d\n",l-len%l); 41 } 42 } 43 return 0; 44 }
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 #define N 100010 7 8 char s[N]; 9 int nextval[N]; 10 int len; 11 12 void getnext(const char *s) 13 { 14 int i = 0, j = -1; 15 nextval[0] = -1; 16 while(i != len) 17 { 18 if(j == -1 || s[i] == s[j]) 19 nextval[++i] = ++j; 20 else 21 j = nextval[j]; 22 } 23 } 24 25 int main() 26 { 27 int ncase; 28 int length, add; 29 scanf("%d", &ncase); 30 while(ncase--) 31 { 32 scanf("%s", s); 33 len = strlen(s); 34 getnext(s); 35 for(int i = 0; i <= len; ++i) //查看next数组的内容 36 cout<<nextval[i]<<" "; 37 cout<<endl; 38 length = len - nextval[len]; //循环节的长度 39 if(len != length && len % length == 0) //循环多次 40 printf("0\n"); 41 else 42 { 43 add = length - nextval[len] % length; //取余的作用:abcab,去掉abc 44 printf("%d\n",add); 45 } 46 } 47 return 0; 48 }
标签:soft names ted data thinking cli rda important ack
原文地址:http://www.cnblogs.com/z-712/p/7306255.html