http://acm.timus.ru/problem.aspx?space=1&num=1684
kmp
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
const int MM = 1111111; #define debug puts("wrong") typedef __int64 int64; char str[MM], ch[MM]; int n,m; int fail[MM], ans[MM], cnt; void get_next(int n) { int i, j=-1; for(fail[0]=-1, i=1;i < n; i++) { while(j>=0 && str[i]!=str[j+1]) j=fail[j]; if(str[j+1]==str[i]) j++; fail[i]=j; } } void get_data() { int i,j,k; gets(str); gets(ch); n=strlen(str), m=strlen(ch); get_next(n); } void solve() { int i,j=-1,k,len=0; bool ff=true, flag=true; cnt=0; ans[cnt++]=0; for(i=0;i<m;i++) { ff=true; if(ch[i]!=str[j+1]) len=j+1,ff=false; while(j>=0 && ch[i]!=str[j+1]) j=fail[j]; if(!ff) ans[cnt++]=i-j-1;//printf("%d %d %d\n",j,i,len); if(ch[i]==str[j+1]) j++; else { //printf("%d\n",i); flag=false; break; } } puts(flag?"No":"Yes"); if(flag) { // for(i=0;i<cnt;i++) printf("%d ",ans[i]); printf("\n"); for(i=0;i<cnt-1;i++) { for(j=ans[i];j<ans[i+1];j++) printf("%c",ch[j]); printf(" "); } for(i=ans[cnt-1];i<m;i++) printf("%c",ch[i]); printf("\n"); } } int main() { get_data(),solve(); return 0; } /* abracadabra abrabracadb abcd aa */