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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章