hdu1867 A + B for you again
#include <stdio.h>
#include <string.h>
#define MAXN 100005
char str1[MAXN],str2[MAXN];
int next[MAXN];
void getNext(char *s,int len)
{
int j=0,k=-1;
next[0]=-1;
while( j < len )
{
if(k == -1 || s[j] == s[k])
{
++j;
++k;
next[j] = k;
}
else k = next[k];
}
}
int kmp(char *s,char *pat)
{
int i = 0,j = 0,len1 = strlen(s),len2 = strlen(pat);
getNext(pat,len2);
while(i < len1 && j < len2)
{
if( j == -1 || s[i] == pat[j])
{
++i;
++j;
}
else j = next[j];
}
// printf("i=%d j=%d\n",i,j);
if( i >= len1 ) // asdf sdfgh asdf asdfgh
{
return j;
}
else //asdf ghk asdfx sdfgh
{
return 0;
}
}
int main()
{
while(scanf("%s%s",str1,str2)!=EOF)
{
int idx1,idx2;
idx2 = kmp(str1,str2);
idx1 = kmp(str2,str1);
// printf("idx2=%d idx1=%d\n",idx2,idx1);
if( idx1 == idx2)
{
if(strcmp(str1,str2) < 0)
{
printf("%s%s",str1,str2+idx2);
}
else
{
printf("%s%s",str2,str1+idx1);
}
}
else if( idx2 > idx1 )
{
printf("%s%s",str1,str2+idx2);
}
else
{
printf("%s%s",str2,str1+idx1);
}
printf("\n");
}
return 0;
}
浙公网安备 33010602011771号