2594(KMP接頭辞と接尾辞) - HDUシンプソンズ隠れた才能 - [Kuangbinが飛ぶためにあなたを取る] KMP&トピック16は、KMP&Manacher Jを拡張しました

J -シンプソンズ隠された才能HDU - 2594

トピックへのリンク:https://vjudge.net/contest/70325#problem/J

トピック:

ホーマー:マージ、私はちょうど私たちが持っていた知らなかった才能のいくつかを発見する方法を考え出しました。
マージ:うん、それは何ですか?
ホーマー:たとえば、私を取ります。私はOK、私は政治に才能を持っているかどうかを確認したいですか?
マージ:OK。
ホーマー:だから私は、いくつかの政治家の名前を取るクリントンを言うと、最長プレフィックスの長さを見つけることを試みる
私の名前に接尾辞であるクリントンの名前にします。それは私がクリントンのような政治家であることにしていますどれだけ近いかだ
マージ:地球上のサフィックスがある最長のプレフィックスを選択するのはなぜ?
ホーマー:まあ、私たちの才能が深くマージ、自分自身の中に隠されています。
マージ:だから、どのように接近していますか?
ホーマー:0!
マージ:私は驚いていませんよ。
ホーマーは:しかし、あなたが知っている、あなたはあなたの中に深く隠されたいくつかの本当の数学の才能を持っている必要があります。
マージ:どのように来ますか?
ホーマー:リーマンとマージョリーは3を与えます!
マージ:リーマンいったい誰ですか?
ホーマー:気にしません。
文字列s1とs2与え、プログラムを書く、S2の接尾辞であるS1の最長の接頭辞が見つかりました。

InputInputは2行で構成されます。最初の行は、S1含まれており、2行目は、S2が含まれています。あなたはすべての文字をとることができるlowercase.OutputOutputにあり、そのプレフィックスの長さが続くS1とS2の接尾語の接頭語であり、最長の文字列を含む単一の行で構成されています。最長のような文字列が空の文字列である場合、出力は0であるべきである
S1、S2の長さは最大で50000.Sample入力されます
クリントン
ホームラン
リーマン
マージョリー
サンプル出力
0 
RIE 3 
質問の意味:最初の文字列と2番目の文字列のプレフィックスが接尾語の接頭辞で、そうでない場合は、出力-1見つけ、あなたに2つの文字列を与える;
アイデア:あなたが再確立することができます文字列、真ん中の2つにこれらの文字列、!接続を防止プレフィックスを接続し、[LEN]が一緒に文字列を入れて、プレフィックスとサフィックスに等しくnextt、lenは、文字列の部分の長さ
//  
// 2019年8月16日にHJYLによって作成されます。
//
する#include <iostreamの> 
の#include <ベクトル> 
の#include <マップ> 
書式#include <文字列> 
の#include <キュー> 
の#include <スタック> 
の#include < セット > 
の#include <アルゴリズム> 
書式#include <cstdioを> 
する#include < CString> 
の#include <cmath> 
の#include <cstdlib> 
名前空間stdを使用。
typedefの長い長いLL。
const int型MAXN = 1E6 + 10 
チャーSTR [MAXN]、0009 [MAXN]、STR2 [MAXN]。
int型nextt [MAXN]。
空隙GETNEXT()
{ 
    int型I = 0、J = -1 
    nextt [ 0] = - 1 
    INT LEN = STRLEN(STR2)。
    一方(iは< LEN)
    { 
        場合(J == - 1 || STR2 [I] == STR2 [J])
        { 
            iが ++、J ++を// もし(str2の[I] = str2の[J]!) 
                nextt [i]は= J;
          // 
               // nextt [I] = nextt [J]。
        } そう
            J = nextt [J]。
    } 
} 

メインINT()
{ 
   //freopenは( "C:\\ユーザー\\ asus567767 \\ CLionProjects \\無題\\テキスト"、 "R"、STDIN); 
    一方、(〜のscanf("%sの%sの" 、STR、0009))
    { 
        int型LEN = STRLEN(STR)。
        INT LEN1 = STRLEN(0009)。
        int型POS = 0 ;
        以下のために(INT i = 0; iがLEN <; iは++ 
            STR2 [POS ++] =のSTR [I]。
        str2の[POS ++] = '!' ;
        以下のために(; I <LEN1; I = 0 int型私は++ 
            STR2 [POS ++] = STR1を[I]。
        GETNEXT(); 
//         coutの<< LEN2 << "= LEN2" << endl; 
//        coutの<< nextt [LEN2] << "HHH" <<てendl; 
//         coutの<< "STR2 =" << STR2 <<てendl; 
        もし(nextt [POS] <= 0 
            のprintf("0 \ n" );
        {
             ため(; iはnextt [POSを<; I = 0 int型私は++ 
                のprintf("%cを" 、STR2 [I])。
            printf("%d個の\ n" 、nextt [POS])。
        } 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Vampire6/p/11365307.html