[kuangbin帶你飛]專題十六 KMP & 擴充套件KMP & Manacher - I - Simpsons’ Hidden Talents

weixin_34402408發表於2018-08-02

題目

題目大意

找s1最長字首等於s2的字尾。

思路

連線s1,s2,利用失敗函式next從k=next[plen],依次k=next[k],知道k同時小於等於s1,s2的長度。

AC程式碼

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 100002;
int NEXT[MAXN];
string P;
string T;
int plen;
int tlen;
void getNEXT(){
    int k,j;
    k = -1;j = 0;NEXT[0] = -1;
    while(j<plen){
        if(k==-1||P[k] == P[j]){
            NEXT[++j] = ++k;
        }else{
            k=NEXT[k];
        }
    }
    
}


int main(){
    ios::sync_with_stdio(false);
    string s1;
    string s2;
    int lenS2;
    int lenS1;
    while(cin>>s1){
        cin>>s2;
        lenS2 = s2.length();
        lenS1 = s1.length(); 
        P = s1 + s2;
        plen = P.length();
        getNEXT();
//      cout<<"檢視next"<<endl;
//      for(int i = 0 ;i<plen;i++){
//          cout<<NEXT[i]<<" ";
//      }
//      cout<<endl;
        int k = plen;
        while(k>lenS1||k>lenS2){
            k = NEXT[k];
        }
        if(k!=0){
            cout<<s1.substr(0,k)<<" "<<k<<"\n";
        }else{
            cout<<k<<"\n";
        }
    }
    return 0;
}

相關文章