[ハッシュ - +アナログ文字列照合スタック] SCU - 4438:検閲(ハッシュ詳細HA)

ハッシュが出席をしていないので、下を見ませんでした:最初に書きます。これは最初の質問、直接文字列Tの暴力を開けランキングIです。昨日、実際には、私はあまりにも性急な、ハッシュを見て、そうしている非常に単純なハッシュレン下目黒は理解しています。今日作る(だから、23333333 5を参照するために愛をあきらめます)。


 _ハッシュ文字列マッチング

我々 「」 - 1-26文字、特定の文字列と同等として「Z」の適切なバンドその対応するビットのハッシュ値がされている「多数」の、合計で重み付け。初期化  ハッシュ[0] = 0; ハッシュは[I] =ハッシュ[I - 1] * BASE + S [I] - '+ 1 ; //ハッシュは実際接頭辞

最適化するために、これハッシュ値の範囲は、以下の式を有します:ハッシュ[L、R] =ハッシュ[R]  - ハッシュ[1  -  1] *ベース^ {R  -  L + 1}

私たちの適切なバンドでベースは、通常、大きな素数を取ります。以下のためにベース^ {R  -  L + 1}私たちの現在のそれは、P []は対応して配列に前処理することができるP [R  -  L + 1] =ベース^ {R  -  L + 1}、我々は非常に便利である時間をトラバースします。

よりよいこの式を理解するために、栗を与えます:

比如我们有十进制数211
Hash[0] = 0
Hash[1] = 2
Hash[2] = 2 * 10 + 1 = 21
Hash[3] = (2 * 10 + 1) * 10 + 1 = 211
那么Hash[2, 3] = ?
Hash[2, 3] = Hash[3] - Hash[1] * 100 = 211 - 2 * 100 = 11

Conclusion: 区间求哈希值和上面的过程类似

私たちは、その場合のオーバーフローであれば、それは自動的に引き継ぎます、長い長いunsighedで[]ハッシュされます2 ^ {64}これは、ハッシュの衝突を引き起こす可能性があります。しかし、確率は非常に低いです。(私は。私は聞いていないだろう自然にどのように解決ハッシュ衝突に、白用としての私のマスターはBaiduは言った......と、そう後で0.23333333それについての話に会った質問)

 


 SCU - 4438:検閲

  • 質問の意味:タールの文字列に敏感で、ターゲット文字列sを与えます。要件は、対象文字列です敏感な文字列を表示することはできません、イベントので、最後に、我々はそれを得ることができる法的なものを文字列、(前に削除しても、途中まで依存した文字列を登場場合があります)。わずかqwq削除されますか?文字列は空にすることができます。
  • アイデア:まず、我々は第1のハッシュ値に敏感な文字列は、アウトカウント、その後、我々は、スタックにプッシュ、ターゲット文字列を横断し始めます。長さは、ハッシュ値算出フォワードlen_tar長の終了文字列として現在の位置に対して、敏感len_tar文字列の長さよりも大きい場合、ターゲット文字列とハッシュ値が等しい場合、次に文字サブ削除文字列。(スタックポインタの操作に対応して移動されます)
  • [また、特定の操作のためのコードを参照してください:最後の有効な文字列の後ろに出力文字列に加え、「\ 0」が、%sの直接出力することができます]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define INF 0x3f3f3f3f
#define lowbit(x) x & (-x)

#define MID (l + r ) >> 1
#define lsn rt << 1
#define rsn rt << 1 | 1
#define Lson lsn, l, mid
#define Rson rsn, mid + 1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define eps  1e-6

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxN = 5e6 + 5;
const ull base = 131;
ull Hash[maxN], p[maxN];
char s[maxN], tar[maxN], ans[maxN];
void pre()
{
    p[0] = 1;
    for(int i = 1; i < maxN; i ++ )
        p[i] = p[i - 1] * base;
}
int main()
{
    pre();
    while(~scanf("%s%s", tar, s))
    {
        int len_tar = strlen(tar);
        int len_s = strlen(s);
        if(len_s < len_tar)
        {
            printf("%s\n", s);
            continue;
        }
        ull tar_hash = 0;
        for(int i = 0; i < len_tar; i ++ )
            tar_hash = tar_hash * base + tar[i] - 'a' + 1;
        Hash[0] = 0;
        int top = 0;
        for(int i = 0; i < len_s; i ++ )
        {
            ans[top ++ ] = s[i];
            Hash[top] = Hash[top - 1] * base + s[i] - 'a' + 1;
            if(top >= len_tar && Hash[top] - Hash[top - len_tar] * p[len_tar] == tar_hash)
                top -= len_tar;
        }
        ans[top] = '\0';
        printf("%s\n", ans);
    }
    return 0;
}

 ステッカーは、3つの利点は、ハッシュを説明してい

https://www.cnblogs.com/zyf0163/p/4806951.html

https://www.cnblogs.com/Slager-Z/p/7807011.html

https://oi-wiki.org/string/hash/

 

彼は190元の記事を発表 ウォン称賛57 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_44049850/article/details/104068002