Description
求子串的next值,用next数组存放,全部输出
Input
输入一个字符串
Output
输出所有next值
Sample Input
abaabcac
Sample Output
0 1 1 2 2 3 1 2
#include <iostream> #include <cstring> using namespace std; int main(){ char s[100]; cin>>s; int suffix[100]; int len=strlen(s); int pos=0; suffix[0]=-1; suffix[1]=0; for(int i=2;i<=len;++i){ while(pos>=0&&s[pos]!=s[i-1]) pos=suffix[pos]; suffix[i]=++pos; } int i=1; cout<<suffix[0]+1; while(i<strlen(s)){ cout<<' '<<suffix[i]+1; i++; } return 0; }
Description
输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成功,则输出0
Input
输入一个主串和一个子串
Output
匹配的趟数
Sample Input
ababcabcacbab abcac
Sample Output
#include <iostream> #include <cstring> using namespace std; int main(){ char s[100]; char b[100]; cin>>b; cin>>s; int suffix[100]; int len=strlen(s); int pos=0; suffix[0]=-1; suffix[1]=0; for(int i=2;i<=len;++i){ while(pos>=0&&s[pos]!=s[i-1]) pos=suffix[pos]; suffix[i]=++pos; } int i=0,j=0; int cns=1; bool flag=false; while(i<strlen(b)) if(b[i]==s[j]){ j++; i++; if(s[j]=='\0'){ flag=true; break; } } else if(suffix[j]==-1){ i++; j=0; cns++; } else { j=suffix[j]; cns++; } if(flag)cout<<cns<<'\12'; else cout<<0<<'\12'; return 0; }
Description
输入一个主串和一个子串,若匹配成功,则找出匹配的趟数和在子串在主串中的位置,若匹配不成功,则输出0
Input
输入两个字符串
Output
输出匹配的趟数和位置
Sample Input
ababcabcacbab abcac
Sample Output
3 6
#include <iostream> #include <cstring> using namespace std; int main(){ char s[100]; char b[100]; cin>>b; cin>>s; int suffix[100]; int len=strlen(s); int pos=0; suffix[0]=-1; suffix[1]=0; for(int i=2;i<=len;++i){ while(pos>=0&&s[pos]!=s[i-1]) pos=suffix[pos]; suffix[i]=++pos; } int i=0,j=0; int cns=1; bool flag=false; while(i<strlen(b)) if(b[i]==s[j]){ j++; i++; if(s[j]=='\0'){ flag=true; break; } } else if(suffix[j]==-1){ i++; j=0; cns++; } else { j=suffix[j]; cns++; } //cout<<"i "<<i<<" j "<<j<<" len "<<strlen(b)<<'\12'; if(flag)cout<<cns<<' '<<i-j+1<<'\12'; else cout<<0<<'\12'; return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zp___waj/article/details/47612563