9.6
FZU 1901 Period II
并不需要完整的周期。即最后一段可以不完整。
所以直接沿Next往后找就可以了。
行末不能有空格不然PE。
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <vector> 5 using namespace std; 6 int m,Next[1000100]; 7 char b[1000100]; 8 9 void getNext(void) 10 { 11 Next[0]=Next[1]=0; 12 for(int i=1;i<m;i++) 13 { 14 int j=Next[i]; 15 while(j&&b[i]!=b[j]) j=Next[j]; 16 Next[i+1]=b[i]==b[j]?j+1:0; 17 } 18 return; 19 } 20 21 int main(void) 22 { 23 int T; cin>>T; 24 for(int kase=1;kase<=T;kase++) 25 { 26 scanf("%s",b); 27 m=strlen(b); 28 getNext(); 29 vector<int> ans; 30 int pos=m; 31 while(pos) 32 { 33 pos=Next[pos]; 34 ans.push_back(pos); 35 } 36 printf("Case #%d: %d\n",kase,ans.size()); 37 for(int i=0;i<ans.size()-1;i++) printf("%d ",m-ans[i]); 38 printf("%d\n",m-ans[ans.size()-1]); 39 } 40 return 0; 41 }
Aguin
时间: 2024-10-13 10:40:31