最小長HUST - - 1010(KMPサイクルセクション)KMP&トピック16 [Kuangbinが飛ぶためにあなたを取る]をKMP&Manacher Fを延長

F -最小長HUST - 1010

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

トピック:

Aの長さが1,000,000未満である文字列A.があります。私は何度も何度もそれを書き換えます。それから私は、新しい文字列を得た:AAAAAA ......、あなたの文字列Bを与えるあなたが私に最短の文字列Aの長さを伝えることができ、今、私は2つの異なる位置からそれをカットし、その後、新しい文字列Bを取得します
例えば、A = "ABCDEFG"。私はABCDだ efgabcdefgabcde あなたが最短A.見つける必要があり、Bから文字列Bとしてefgabcdefgabcde:その後、私は赤い部分をカット.... fgabcdefgを

InputMultiplyテストケースを。
各ラインについてのみ、小文字と大文字のキャラを含む文字列Bがあります。
Bの長さは1,000,000以下です。
入力above.Sample説明したように、各行、出力整数、OutputFor
bcabcabの
efgabcdefgabcde
サンプル出力
3 
7 
質問の意味:の最小サイクル長セクション検索
のアイデア:今ので、提出の質問はサポートしていない、N-次の[N]でKMPは、最小サイクルの長さの部分で、私は私が書いたものを掲載しました

//  
// 2019年8月15日にHJYLによって作成されます。
//
 
する#include <iostreamの> 
の#include <ベクトル> 
の#include <マップ> 
書式#include < 文字列 > 
の#include <キュー> 
の#include <スタック> 
の#include < セット > 
の#include <アルゴリズム> 
書式#include <cstdioを> 
する#include < CString> 
の#include <cmath> 
の#include <cstdlib>
 使用して 名前空間はstdを、
const  int型 MAXN = 1E6 + 10 int型nextt [MAXN]。
ボイドGETNEXT()
{ 
    int型 I = 0、J = - 1 
    nextt [ 0 ] = - 1 INT、N = STRLEN(STR)。
    しながら、式(I < N)
    { 
        場合は - (J == 1 || STR [I] == STR [J])
        { 
            iが ++、J ++をもし(!STR [I] = STR [J])
                nextt [i]は = jで。
            
                nextt [I] = nextt [J]。
        }他の
            J = nextt [J]。
    } 
} 
int型のmain()
{ 
    // freopenは( "C:\\ユーザー\\ asus567767 \\ CLionProjects \\タイトルなし\\テキスト"、 "R"、STDIN)。
    一方、(〜のscanf(" %sの" 、STR))
    { 
        GETNEXT()。
        INT LEN = STRLEN(STR)。
        printf(" %d個の\ n "、len- nextt [LEN])。
    } 
    戻り 0 
}

 


おすすめ

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