hdu1867 A + B for you again KMP
2013-03-15 18:33
274 查看
题意:给你两个串,求他们连接成的最短串,连接时合并相同部分。还有当以两种方式连接(s1s2、s2s1)得到的最短长度相同时,取字典序最小那种。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=100005; int next ; void init(char *s)//get next[] { int i,j; next[0]=0; for(i=1,j=0;s[i];i++) { while(j>0&&s[j]!=s[i]) j=next[j-1]; if(s[j]==s[i]) j++; next[i]=j; } } int getLength(char *s1,char *s2)//get the length of the same part { int i,j; init(s2); for(i=j=0;;i++) { while(j>0&&s1[i]!=s2[j]) j=next[j-1]; if(s1[i]==s2[j]) j++; if(s1[i+1]=='\0') break; if(s2[j]=='\0') j=0; } return j; } void output(char *s1,char *s2,int n) { int len=strlen(s1); for(int i=0;i<len-n;i++) putchar(s1[i]); printf("%s\n",s2); } int main() { char s1 ,s2 ; while(~scanf("%s%s",s1,s2)) { int len1=getLength(s1,s2); int len2=getLength(s2,s1); if(len1>len2) output(s1,s2,len1); else if(len2>len1) output(s2,s1,len2); else { if(strcmp(s1,s2)<0) output(s1,s2,len1); else output(s2,s1,len2); } } return 0; }
相关文章推荐
- HDU1867:A + B for you again(KMP)
- 【KMP】 hdu1867 A + B for you again
- 【KMP】hdu1867(A + B for you again) 杭电java a题真坑
- 【KMP】hdu1867(A + B for you again) 杭电java a题真坑
- HDU1867:A + B for you again【kmp】
- hdu1867 A + B for you again(kmp)
- HDU1867 - A + B for you again(KMP)
- 【hdu1867】A + B for you again——KMP
- 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 1867 A + B for you again(KMP:后缀与前缀)
- HDU A + B for you again (KMP)
- HDU 1867 A + B for you again KMP解决问题的方法
- HDU(1867)A + B for you again (KMP)
- 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 数据结构+KMP简单应用
- HDU1867_A + B for you again