hdu1867——A + B for you again
阿新 • • 發佈:2018-12-19
居然要用到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;
}