题目链接:
题意:读入串1和串2,输出串2的前缀和串1的后缀最长公共部分和长度。
思路:将串1作为子串s2,串2作为主串s1,套用kmp.
#include#include #define N 50010char s1[N],s2[N];int next[N],l1,l2;void get_next(){ int j,k; j = 0; next[0] = k = -1; while(j < l2) { if(k==-1||s2[j]==s2[k]) next[++j] = ++k; else k = next[k]; } return;}void kmp(){ int i,j,k; i = j = 0; while(i < l1) { if(j == -1||s1[i]==s2[j]) { i++; j++; } else j = next[j]; } if(!j)//当s1的后缀和s2前缀不匹配时 printf("0\n"); else { for(k = 0; k < j; k ++)//j是能匹配到s2前缀的长度 printf("%c",s2[k]); printf(" %d\n",j); } return;}int main(){ while(scanf("%s %s",s2,s1)!=EOF) { //读入时,将第二行字符串作为主串,第一行字符作为子串 l1 = strlen(s1); l2 = strlen(s2); get_next();//建立next数组 kmp();//字符串前后缀匹配 } return 0;}