BZOJ 1398:Vijos1382所有者ネックレス(最小表記)を見つけます

説明

2つのネックレス、彼らはネックレスかもしれないかどうかを判断するための表現を考えます。

入力

入力ファイル2つだけの行、0-9からなる文字列からなる各ラインは、(ネックレス等しい長さを確保する)ネックレスの表現を記述する。

出力

2つのネックレス均質可能であれば、出力「いいえ」、そうでない場合、最初の行の出力「はい」
ネックレス辞書式に最小の第2行の出力。ネックレスのL =長さはL <= 1000000、提供されます。

サンプル入力

2234342423

2423223434

サンプル出力

はい

2234342423

ヒント

 

ソース

/// 
///                             _ooOoo_
 ///                            o8888888o
 ///                            88" 88。」
 ///                            (| -_- |)
 ///                            O \ = / O
 ///                         ____ / `--- '\ ____
 / // \\ | | // `。
///                      / \\ ||| :||| // \
 ///                     / _ ||||| - : - ||||| - \
 ///                     | | \\\ -   /// | |
///                     | \ _ | '' \ --- / '' | |
///                    \ .- \ __ `-` ___ / - 。/
 ///                   ___ `。。」/--.-- \ `。__
 ///                。 "" ' < `.___ \ _ <|> _ / ___。' > ' ""。
///               | | 。: ` - \`; `\ _ /`;.`/ - `:| |
///               \ \ ` - 。\ _ __ \ / __ _ /。、 `/ /
 ///          ======` `-.____ -.___ \ _____ / ___.-` ____.- "======
 ///                             `= --- =」
 ///         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
 ///                       仏祝福、ノーバグ!
///
する#include <iostreamの> 
の#include <cstdioを> 
する#include <
書式#include <CStringの> 
の#include <cmath> 
の#include <cstdlib> 
書式#include <キュー> 
の#include <スタック> 
の#include <ベクトル>
 使用して 名前空間はstd;
#define MAXN 100010
 の#defineっ長い長い文字列、B; int型 minma( X)/// 最小循环同构{
     INT LEN = x.size()。
    int型 I = 0、J = 1、K = 0/// 初始化I = 0、J = 1 、一方





    (私の<LEN && J <K && LEN <LEN)/// 直接復路走査
    {
         int型 T X = [(IがK + 1)%LEN] - Xの[(J + K)%LEN]; /// 比較X [i]と同形列X [J] 2サイクル
        IF(Tの== 0/// スキャンの場合、n個の文字に等しいままであり、わずか1 X文字構成を説明し、任意のx [i]があり、その最小表す 
            K ++を他は/// iがKとj + kは+場合発見に等しくない
        {
             IF(T> 0/// X [I + K]> Xの場合 、[J + K] [X次いでI + 1]、X [I + 2]、...、X [I + k]はxの最小値はまた、あなたがこれらの位置スキップし、表現されていないで 
                、私は+ = K +を1。;
             /// の場合X [I + K]<X [J + K]は、X [J + 1]、X [J + 2]、...、X [j + k]はxの最小値も示されていない場合、これらの位置のスキップ
                 jは+ 1 = K +; 
            IF(J == I)/// 二つのポインタが等しい場合、一つはバックに移動させ、最小サイクル同型見つけやすい 
                J ++を
            K = 0 ; 
        } 
    } 
    戻り?私はJ Iを< :J; /// 最小サイクル同形の位置返す
} 

int型のmain()
{ 
    CIN >> A >> Bを、
     INTレナa.size =()= LENB b.size();
     IF(レナ=!LENB )
        のprintf(" ノーN- \ " );
     
    {
        INT num_a = minma(A)。
        INT num_b = minma(B)。
        int型のk = 0 ; K <レナ; ++ k個
        { 
            もし([(num_a + K)%のリナ] = Bの[(num_b + K)%の!レナ])
            { 
                のprintf(" なしの\ n " );
                リターン 0 ; 
            } 
        } 
        のprintf(" はいの\ n " );
        以下のためにint型私は= 0 ; I <レナ私は++ 
            COUTを<< [(iは+ num_a)%のリナ]。
        coutの << ' \ nを' ; 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/RootVount/p/11352127.html