题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594
题意:读入串1和串2,输出串2的前缀和串1的后缀最长公共部分和长度。
思路:将串1作为子串s2,串2作为主串s1,套用kmp.
#include<stdio.h> #include<string.h> #define N 50010 char 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 "); else { for(k = 0; k < j; k ++)//j是能匹配到s2前缀的长度 printf("%c",s2[k]); printf(" %d ",j); } return; } int main() { while(scanf("%s %s",s2,s1)!=EOF) {//读入时,将第二行字符串作为主串,第一行字符作为子串 l1 = strlen(s1); l2 = strlen(s2); get_next();//建立next数组 kmp();//字符串前后缀匹配 } return 0; }