字符串 KMP HDU 2594

来源:互联网 发布:淘宝分享有赏红包在哪 编辑:程序博客网 时间:2024/05/16 17:16
#include <stdio.h>#include <string.h>#define min(a,b) ((a)<(b)?(a):(b)) /*clintonhomerriemannmarjorie题意: 前缀和后缀 的最长匹配 思路:KMP ,将前一个串和后一个串链接起来,求next[n]就是答案 */const int N = 50005;char a[N],b[N],c[2*N];int next[2*N];//注意  int lena,lenb,lenc;void getNext(){int j=-1;next[0]=-1;for(int i=1;i<lenc;i++){while(j>=0 && c[i]!=c[j+1])j=next[j];if(c[i]==c[j+1])j++;next[i]=j;}/*for(int i=0;i<lenc;i++)printf("%d ",next[i]);printf("\n");*/ }int main(){while(~scanf("%s%s",a,b)){lena=strlen(a);lenb=strlen(b);strcpy(c,a);strcpy(c+lena,b);lenc=strlen(c); getNext();int k=next[lenc-1]+1; //坑点: 串可能一直匹配下去 int ans=min(min(lena,lenb),k);if(ans==0)printf("0\n");else {for(int i=0;i<ans;i++)printf("%c",a[i]);printf(" %d\n",ans);} }return 0;}

0 0