1 .manachar馬車車アルゴリズム
-------最長の文字列回文を見つけます
時間計算量はO(N)であります
INTは、init()//此操作目的是消除奇偶性 { INT LEN = STRLEN(S)。 S [0] = '@'。S [1] = '#'。 int型J = 2; 以下のために(; iはLEN <I ++は、I = 0 INT) { S [jが++] = sを[I]と、 S [J ++] = '#'; } S [J] = '\ 0'。 Jを返します。//返回修改后的长度 } int型manachar() { int型LEN =初期化()。 int型ANS = -1; int型のp = 0; int型MAXLEN = 0; 以下のために(; iはLEN <I ++はI = 1 INT) { IF(I <MAXLEN)R [I] =分(R [2 * piが〕、maxlenを-I + 1)。 他R [I] = 1。 一方、(S [IR [I]] == S [I + R [I])R [I] ++; IF(maxlenを<I + R [i]が-1) { P = I。 MAXLEN =私はR [I] -1 +。 } ANS = MAX(ANS、R [I] -1)。 } 戻りANS。 }
2. 平方!
ボイドKMP() { [1] J = = 0失敗。 (I 2 = int型; I <= M; iが++)は { (J && [J + 1] = B [i]は!)jは=失敗しながら、[I]。 IF(失敗[J + 1] ==失敗[I])J ++。 [i]はJ =失敗。 } J = 0。 (I 1 = int型私は++; iが<= N)のために { (!J && B [j + 1] = FA [i])とjは= [j]を失敗しつつ。 もしJ ++(B [J + 1] [I] ==)と、 IF(J == M) { COUT << "マッチ" << I-M + 1 << ENDL。 J =失敗[J]。 } } }
3. ハッシュ
BOOLマーク[524288]。 unsigned int型checkhash(文字列str) { unsigned int型種子= 131。 unsigned int型ハッシュ= 0、I = 0、LEN = sre.length()。 (私がlen <)ハッシュ=ハッシュ*シード+ STRながら[I ++]。 リターン(ハッシュ&0x7FFFF)。 }
4.最小表記
cinを>>秒; L = s.length()。 S = sの+ S。 I = 0、J = 1; (私はL && J <Lを<)しながら、 { (K ++; <L kはk = 0)のために (!S [I + K] = sで[J + K])破る場合。 もし(K == L)ブレーク。 (S [I + K]> S [J + K])であれば、I + = K + 1。 そうであれば(S [I + K] <S [J + K])J + = K + 1。 (I == j)はJ ++であれば、 } COUT <<分(i、j)は<< ENDL。