求字符串ptr的前缀与str的后缀的最大相同子串,若不存在,输出0。

样例输入
mike aniom kiava dvakia dasds fdsgh
样例输出
m 1 kia 3 0
分析:

先求字符串ptr的next数组,然后使用KMP算法求ptr的前缀与str后缀的最大相同子串
#include<cstdio> #include<cstring> using namespace std; const int maxn=1e5+10;
void cal_next(char* str,int* next,int len) { next[0]=next[1]=0; for(int
i=1;i<len;++i) { int j=next[i]; while(j&&str[i]!=str[j]) j=next[j];
next[i+1]=(str[j]==str[i])?j+1:0; } } int kmp(char *str,int slen,char *ptr,int
plen) { //int *next=new int[plen]; int next[maxn]; cal_next(ptr,next,plen); /*
for(int i=0;i<plen;i++) printf("%d ",next[i]); printf("\n"); */ int j=0;
for(int i=0;i<slen;i++) { while(j&&ptr[j]!=str[i]) j=next[j];
if(ptr[j]==str[i]) ++j; } //printf("j:%d\n",j); return j; } char
str[maxn],ptr[maxn],ans[maxn]; int main() { while(scanf("%s%s",ptr,str)!=EOF){
int plen=strlen(ptr),slen=strlen(str); int len=kmp(str,slen,ptr,plen);
//printf("len:%d\n",len); if(len==0) printf("0\n"); else{
memset(ans,0,sizeof(ans)); memcpy(ans,ptr,len*sizeof (char)); printf("%s
%d\n",ans,len); } } return 0; }
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信