リンク:https://www.lydsy.com/JudgeOnline/problem.php?id=1398
トピック:
説明
2つのネックレス、彼らはネックレスかもしれないかどうかを判断するための表現を考えます。
入力
入力ファイル2つだけの行、0-9からなる文字列からなる各ラインは、(ネックレス等しい長さを確保する)ネックレスの表現を記述する。
出力
2つのネックレス均質可能であれば、出力「いいえ」、そうでない場合、最初の行の出力「はい」
ネックレス辞書式に最小の第2行の出力。ネックレスのL =長さはL <= 1000000、提供されます。
サンプル入力
2234342423
2423223434
2423223434
サンプル出力
はい
2234342423
2234342423
アイデア:
式最低限タイトル
コード:
#include <ビット/ STDC ++ H> 使用して名前空間STDを、 const int型 MAXN = 1E6 + 10 。 チャー[MAXNを]、B [MAXN]。int型 getmin(チャー * sで、int型のn){ int型 I = 0、J = 1、K = 0 、T。 一方(iは<N && J <N && K < N){ たT = sの[(I + K)%のN] [(J + K)%の-s N]; もし(!トン)のk ++ ; 他{ もし(T> 0)、I + = K + 1 。 他の J + = K + 1 ; もし(I == j)はJ ++ ; K = 0 。 } } リターン私は<jの?I:J。 } int型のmain(){ scanf関数(" %sの" 、A)。 scanf関数(" %sの" 、B)。 INT LEN = STRLEN(A)。 INT K1 = getmin(LEN)。 INT K2 = getmin(B、LEN)。 文字列 S1 = ""、S2 = "" ; 以下のための(int型 I = 0; iがLEN <; iは++ ){ S1 + = [(K1を+ I)%LEN]。 S2 + = Bの[(K2 + I)%LEN]。 } であれば(S1 == S2){ のprintf(" はいの\ n " ); coutの << S1 << てendl; } 他のprintf(" ノー\ nを" ); リターン 0 ; }