文字列の知識の大規模なコレクション

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。

  

おすすめ

転載: www.cnblogs.com/cocacolalala/p/11345046.html