ねえ
これは、タイムアウトやスーパーメモリとなっています
その後、変更が、その後変更された答えが間違っています
そして、最終的位置はハッシュしないと結論付けました
アイムどこかにこれを見つけるために:
// https://www.cnblogs.com/napoleon_liu/archive/2010/12/29/1920839.html (Aのuint32_t)ハッシュのuint32_t { A =(A + 0x7ed55d16)+(<< 12 )。=(^ 0xc761c23c)^(>> 19 )。=(A + 0x165667b1)+(<< 5 )。=(A + 0xd3a2646c)^(<< 9 )。=(A + 0xfd7046c5)+(<< 3)。// A =(^ 0xb55a4f09)^(>> 16 ); 返します。 }
それから私は、この変更を借りるように変更しました
しかし、それは......私は再び曇った剰余に行き、その後、符号なしのエラーで応答しませんでした
ちょっと学びます
ハッシュデータは電源で、姿勢を矯正するために注意を払います。
そして、私はそれが以前にあったことに気づきませんでした
// 超メモリ: IF(MP [X-])MP [X-] ++ ; // 超えないメモリ IF(mp.count(X-))MP [X-] ++;
そして、......ねえ
アイデアは、問題の解決策のアイデアです。
ねえ
スーパーメモリがタイムアウトしてきました
結果は出てきた:2132キロバイト3368ms
10000ms 20480キロバイト:それがに権利があります
書式#include <ビット/ STDC ++ H。> の#include <TR1 / unordered_map> に#defineデバッグのprintf( "!"); 使用して 名前空間はstdを、 typedefの長い 長いLL。 typedefの符号なしの長い 長いULL。 const int型 MAXN = 1E5 + 50 。 const int型 INF = 0x3f3f3f3f 。 インラインULL Ghの(ULL A) { A + = 14271 。=(A + 0x7ed55d16)+(<< 12 )。=(A ^ 0xc761c23c)^(>> 19); =(A + 0x165667b1)+(<< 5 )。=(A + 0xd3a2646c)^(<< 9 )。=(A + 0xfd7046c5)+(<< 3 )。=(^ 0xb55a4f09)^(>> 16 )。 返します。 } インラインULLさLh(ULL A) { A = Ghの(* INT_MAX)。=(A + 0x7ecc5d16)+(<< 13 )。=(^ 0xc761c89c)^(>> 17 )。 A=(A + 0x315667b1)+(<< 7 )。=(A + 0xdfa26a6c)^(<< 11 )。=(A + 0xfd7b4aa5)+(<< 5 )。=(A ^ 0xb59b4e09)^(>> 12 )。 リターンGhの(a)は、 } インラインULL RH(ULL A) { A = Ghの(* aは+ 31313 )。=(A + 0x8bd45d31)+(<< 16 )。=(A ^ 0x24bad623)^(>> 15 )。=(A +0x971bfa3b)+(<< 7 )。=(A + 0x12abf315)^(<< 4 )。=(A + 0x2e4174bd)+(<< 7 )。=(^ 0xac5baef5)^(>> 14 )。 リターンGhの(a)は、 } チャーS [MAXN]、TS [MAXN]。 TR1 :: unordered_map <ULL、int型 > 融点; ULL anshs [ 20002 ]。 int型 veclen [ 20002 ]; ULL H; INT のmain() { int型のT。 scanf関数(" %のD "、&T)。 一方、(T-- ) { LL TLEN。 ULL L、R、U、U1、U2、unext、chcut、CHADD。 int型、M、I、J、LEN、W、nextlen、アップ、TOT = 0 。 scanf関数(" %sの" 、S); LEN = strlenを(S)。 scanf関数(" %のD "、&M)。 用(i = 0 ; iがmを<; iは++ ) { scanf関数(" %sの" 、TS)。 TLENの =のSTRLEN(TS)。 Lが = tsの[ 0 ] - [ A 'であり、R = tsの[tlen- 1 ] - [ A ' 。 H = Lhを(L)+ RH(R)。 用(J = 0 ; J <TLEN; J ++ ) { U = tsの[J] - [ A ' 。 時間 =のH + Ghの(U)。 } MP [H] = 1 。 anshs [I] = 時間。 veclen [I] = TLEN。 } ソート(veclen、veclen + M)。 アップ(veclen、veclen + M)=一意- veclen。 Lが = Sで[ 0 ] - ' A ' ; R = sで[veclen 0 ] - 1 ] - [ A ' 。 unext = 0 ; 用(J = 0 ; J <veclen [ 0 ]; jは++ ) { U = S [J] - [ A ' 。 unext = unext + Ghの(U)。 } ため(W = 0; W <アップ; ++ W ) { TLEN = veclen [W]。 nextlen = veclen [+ W 1 ]。 もし(TLEN> LEN)ブレーク。 用(J = 0 ; J + tlen- 1 <LEN; J ++)// 长度滑窗 { Lが = Sで[J] - ' A ' ; R = sで[J + tlen- 1 ] - [ A ' 。 U1 = Lhを(L)+ RH(R)。 もし U =(J!)unext。 他 { chcut = S [J- 1 ] - [ A ' 。 CHADD = R。 もし(J + tlen- 1 < nextlen) { unext = unext + Ghの(R)。 } 、U = U-GH(chcut)+ Ghの(CHADD)。 } であれば(mp.count(U + U1))MP [U + U1] ++ ; } } のための(i = 0 ; iがmを<; iは++)のprintf(" %Dを\ n "、MP [anshs [I]] - 1 )。 mp.clear(); } }
ねえ...