HDU2594 Simpsons’ Hidden Talents KMP

题意:给你两个字符串,问你第一个字符串前缀和第二个字符串的后缀最长匹配长度是多少?

思路: 简单的next数组的理解, 连接两字符串,在连接处加一个无关字符,如‘*’,这样做是为了保证不会出现连接后前后缀最大匹配值大于某个字符串的情况,然后直接输出next[strlen(str)]以及其前缀即可。

代码如下:

#include <bits/stdc++.h>

using namespace std;

const int maxn=50005;
char p[maxn<<1];
char p1[maxn];
int NEXT[maxn<<1];

void Op_NEXT(int n){
    NEXT[0] = -1;
    int k = -1;
    int j = 0;
    while(j < n){
        if(k == -1 || p[k] == p[j]){
            j++;
            k++;
            NEXT[j] = k;
        }
        else{
            k=NEXT[k];
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    memset(NEXT,0,sizeof(NEXT));
    while(cin>>p>>p1){
        int len1=strlen(p);
        int len2=strlen(p1);
        strcat(p,p1);
        int len=len1+len2;
        Op_NEXT(len);
        while(NEXT[len]>len1 || NEXT[len]>len2) len=NEXT[len];
        int res=NEXT[len];
        if(res){
            for(int i=0;i<res;i++) cout<<p[i];
            cout<<" "<<res<<endl;
        }
        else {
            cout<<res<<endl;
        }
    }
    return 0;
}

你可能感兴趣的:(KMP)