HDU_3746_Cyclic Nacklace
/* 求形成循环节需要增加颜色珠子。 */ #include<iostream> #include<cstring> #include<string> #include<cmath> #include<cstdio> #include<algorithm> #include<vector> using namespace std; int lena,lenb,Max; int nt[100005]; void getnt(string b) { int j=0,k=-1; nt[0]=-1; while(j<lenb) { if(k==-1||b[j]==b[k]) //此举旨在找寻B串中重复的东东 { k++,j++; //如果下一个b[j]不等于b[k],那下一次nt[j]要回到k的位置,这是高速回位的方法 nt[j]=k; } else k=nt[k]; } if(k!=0) Max=nt[lenb-1]+1; } int main() { string a,b; while(getline(cin,b,'\n')) { lena=b.length(); getline(cin,a,'\n'); lena=lena>a.length()?a.length():lena; b+=a; Max=0; lenb=b.length(); getnt(b); if(Max==0) cout<<Max<<endl; else { if(Max>lena) Max=lena; b=b.substr(0,Max); cout<<b<<" "<<Max<<endl; } } }