hdu 1867 A + B for you again

一开始wa了很多把, 最后发现自己和之前做的另一道KMP题目搞混了.

这题子串不能出现在句中.

#include <stdio.h>
#include <string.h>
#define N 1000002  
#define M 1000002 
char a[M], b[N];
int Next[N];

void getNext(char s[], int len)
{
    int i, j;
    i = 0; j = -1;
    Next[0] = -1;
    while (i < len)
    {
        if (j == -1 || s[i] == s[j])
            ++i, ++j, Next[i] = j;
        else
            j = Next[j];
    }
}

int KMP(const char a[], const char b[], int pos, int next[], int la, int lb)  
{
    int i, j;
    i = pos, j = 0;
    while (i < la)
    {
        if (j == -1 || a[i] == b[j])
            ++i, ++j;
        else
            j = next[j];
		if(j==lb&&i<la)// 因为不能在主串中间,所以主串没跑完,不能退出
		{
			j=0;
		}
    }
    return j;
	
}

int main()   
{
	int numa,numb,lena,lenb;
    while (scanf("%s%s",a,b)!=EOF)// 注意下  之前打成NULL 一直OLE
    { 
		lena=strlen(a);
		lenb=strlen(b);
		
        getNext(b , lenb);
        numb=KMP(a, b, 0,Next, lena,lenb);
		getNext(a , lena);
        numa=KMP(b, a, 0,Next, lenb,lena);
		if(numa>numb)
		{
			printf("%s%s\n",b,a+numa);
		}
		else if(numa<numb)
		{
			printf("%s%s\n",a,b+numb);
		}
		else //之前比较整合后 的字典序 没想到只用考虑 a,b原来的字符串的字典序
		{
			if(strcmp(a,b)<=0)
				printf("%s%s\n",a,b+numb);
			else
				printf("%s%s\n",b,a+numa);
		}
    }
    return 0;
}


你可能感兴趣的:(KMP)