HDU 1867 A+B for you again
2011-09-15 22:48
381 查看
这道题的意思就是找出一个最大的公共子串,这个子串是一个字符串的尾串(tail substring ),同时是另外那个字符串的头串(head substring),是满足A+B的长度strlen(A+B)达到最小值,这里面要注意的一个问题是,谁做模式串P是不一定的,所以要分别比较不同字符串作为模式的KMP值。
这里用到KMP匹配算法里面的next函数,KMP返回的就是那个公共子串的长度。
View Code
这里用到KMP匹配算法里面的next函数,KMP返回的就是那个公共子串的长度。
View Code
#include <iostream> #include<stdio.h> #include<string.h> #include<string> using namespace std; int next[100010]; void getNext(char P[]) { int j=0,k=-1; next[0]=-1; int lenP=strlen(P); while(j<lenP) { if(k==-1 || P[j]==P[k]) { k++;j++; next[j]=k; } else k=next[k]; } } int KMP(char T[],char P[]) { memset(next,0,sizeof(next)); getNext(P); int posP=0,posT=0; int lenT=strlen(T); while(posT<lenT) { if(posP==-1 || P[posP]==T[posT]) { posP++;posT++; } else posP=next[posP]; } return posP; } char S1[100005],S2[100005]; int main() { while(scanf("%s %s",S1,S2)!=EOF) { int len1=KMP(S1,S2); int len2=KMP(S2,S1); if(len1==len2) { if(strcmp(S1,S2)<0) { printf("%s%s\n",S1,S2+len1); } else { printf("%s%s\n",S2,S1+len1); } } else if(len1<len2) { printf("%s%s\n",S2,S1+len2); } else printf("%s%s\n",S1,S2+len1); } return 0; }
相关文章推荐
- HDU 1867 A + B for you again 字符匹配
- hdu 1867 A + B for you again
- HDU 1867:A + B for you again
- hdu -- 1867 A + B for you again (KMP)
- KMP——HDU 1867 A + B for you again
- HDU—— 1867 A + B for you again
- HDU 1867 A + B for you again (KMP)
- hdu 1867 A + B for you again
- 杭电 hdu 1867 A + B for you again
- hdu 1867 KMP A + B for you again
- hdu 1867 A + B for you again
- KMP——HDU 1867 A + B for you again
- HDU 1867--A + B for you again【KMP】
- 【KMP】hdu 1867 A + B for you again(外:hdu 2594 Simpsons’ Hidden Talents)
- HDU 1867 A + B for you again 字符串拼接 kmp
- HDU 1867 — A + B for you again
- KMP——HDU 1867 A + B for you again
- KMP-hdu-1867 A + B for you again
- HDU 1867 A + B for you again(KMP算法的应用)
- hdu 1867 A + B for you again