1. 程式人生 > >hdu1867——A + B for you again

hdu1867——A + B for you again

居然要用到kmp… 瞎搞了半天…不對是四個月,今天無意中翻到這題還是不會做,抄了下題解 首先這個kmp的匹配就稍微變形了一點,用kmp(a,b)然後不是輸出匹配的位置,也不是輸出匹配的數量,而是輸入當i==sl的時候,也就是原串匹配完了,這時候pat匹配到那個位置,輸入j,這樣把a和b分別作為模式串去匹配另一個,看看誰的字首能連上另一個的字尾的長度更長一些,如果相同再比較字典序

程式碼:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const int N=200050; int Next[N]; char a[N]; char b[N]; char t[N]; void getNext(char* s){ memset(Next,0,sizeof(Next)); int i=0; int j=-1; Next[0]=-1; int l=strlen(s); while(i<l){ if(j==-1 || s[i]==s[j]){ Next[++i]=++j; } else{ j=Next[
j]; } } } int kmp(char *str,char *pat){ memset(Next,0,sizeof(Next)); getNext(pat); int i=0,j=0; int sl=strlen(str); int pl=strlen(pat); while(i<sl && j<pl){ if(j==-1 || str[i]==pat[j]){ i++; j++; } else{ j=
Next[j]; } } if(i==sl){ return j; } else{ return -1; } } int main(void){ while(~scanf("%s %s",a,b)){ int t1=kmp(a,b); int t2=kmp(b,a); if(t1>t2){ printf("%s",a); printf("%s\n",&b[t1]); } else if(t1<t2){ printf("%s",b); printf("%s\n",&a[t2]); } else{ if(strcmp(a,b)<0){ printf("%s%s\n",a,&b[t1]); } else{ printf("%s%s\n",b,&a[t2]); } } } return 0; }