住所: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 ; }