問題のP3370 [テンプレート]の文字列のハッシュソリューション

住所:https://www.luogu.org/problem/P3370

異なる文字列の数を求めて  

    また、この問題は大きなもののハッシュ高く設定していたが、することができます。

    ハッシュは、実際の値にマッピングされた文字列であり、これらの値は大きな確率リピートを任せることはできません

    バイナリハッシュ:ハッシュ進コアバンドは、固定与えられるベース、バイナリビットとして考え各要素の数字の文字列をので、このシリーズは、とみなすことができる基地ヘクス数、この数はハッシュ値です、

    ハッシュ値の異なる文字列ができるだけ異なるように、この問題は、変換方法によって固定されています。ハッシュ衝突を回避するために、適切なバイナリを選択し、一般的に最大値は、すべての文字の対応する数字は、その後、大きな素数を国防省よりも大きく、そして最終的に、重いを宣告され選択します。

    

書式#include <iostreamの> 
の#include <CStringの> 
の#include <アルゴリズム>
 使用して 名前空間はstd; 
typedefのロング ロングLL;
 constの int型 MAXN 1E4 + = 19 ;
 constの LL ベース = 129 ;  
 constの ロング ロング MOD = 212370440130137957ll; //私にはわかりませんなぜこの使用、ライン覚え
LLは[MAXN]有し; 
charはS [MAXN];
 int型 AC(チャー *のSを)
{ 
    int型 LEN = STRLEN(S); 
    LL SUM = 0 以下のためにint型 i = 0 ; iがLEN <; iは++ 
    { 
        合計 =(SUM * 基底 +(LL)S [i])と%MOD。
    } 
    戻り値の和。
} 
int型のmain()
{ 
    LLのT; 
    scanf関数(" %のLLD "、&T)。
    以下のためにint型 i = 0 ; iはTを<I ++の
    { 
        scanf関数(" %sの" 、単数または複数); 
        有する[I] = AC(S)。
    } 
    ソート(有した + t)を、
    LL CNT = 1 int型 iは= 0 ; iが、T < 1 ; iが++ 
    { 
                場合([I] = [I +有しています!1 ])
                CNT ++ 
    } 
    のprintf(" %LLDする\ n " 、CNT)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/liyexin/p/11583419.html