首页 > 代码库 > hdu 1358 KMP next数组的运用
hdu 1358 KMP next数组的运用
题意:给一个字符串,从第二个字符开始,判断前面的是不是循环串,是的话就输出当前位置和循环次数。
考的是对于next数组的理解和灵活运用,字符编号从0开始,那么if(i%(i-next[i])==0),则i前面的串为一个循环串,其中循环子串出现i/(i-next[i])次。
1 #include<iostream> 2 #include<string> 3 #include<string.h> 4 #define MAX_N 1000005 5 6 using namespace std; 7 8 int len; 9 string s; 10 int nexxt[MAX_N]; 11 12 void getNext() 13 { 14 nexxt[0]=-1; 15 int i = 0,j=-1; 16 while(i<=len) 17 { 18 if(j==-1 || s[i]==s[j]) 19 { 20 i++,j++; 21 nexxt[i]=j; 22 } 23 else 24 j=nexxt[j]; 25 } 26 } 27 int main() 28 { 29 int con = 1; 30 while(cin>>len,len) 31 { 32 cin>>s; 33 printf("Test case #%d\n",con++); 34 getNext(); 35 for(int i = 1; i <= len; i++) 36 { 37 if(i%(i-nexxt[i])==0 && i/(i-nexxt[i])>1) 38 cout<<i<<‘ ‘<<i/(i-nexxt[i])<<endl; 39 } 40 cout<<endl; 41 } 42 return 0; 43 }
hdu 1358 KMP next数组的运用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。