//// main.cpp// KMP//// Created by liuzhe on 16/7/16.// Copyright © 2016年 my_code. All rights reserved.//#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <cstdio>using namespace std;#define Size 50002char s1[Size],s2[Size];int anext[Size];int len1,len2;void get_next(){ int i,j; i=0; j=-1; anext[0]=-1; while(i<len1) { if(j==-1||s1[i]==s1[j]) { i++; j++; anext[i]=j; } else j=anext[j]; }}void kmp(){ int i,j; i=0; j=0; while(i<len2) { if(j==-1||s1[j]==s2[i]) { i++; j++; } else j=anext[j]; } if(!j) // 匹配不了 PRintf("%d/n",j); else { for(int k=0;k<j;k++) // 在s1中前j個字符就是共同最長的 printf("%c",s1[k]); printf(" %d/n",j); }}int main(){ while(scanf("%s %s",s1,s2)!=EOF) // 題目要求最長的s1的前綴同時滿足是s2的后綴 { len1=strlen(s1); // 可以反過來想一下,把s2作為主串,s1為子串 len2=strlen(s2); // 然后s1不斷往后移動,匹配之后就可以了 get_next(); kmp(); } return 0;}
新聞熱點
疑難解答