ICPCアジア上海2019 G.サブストリング(スライディングウィンドウ+ハッシュ)のための予備コンテスト

 

G.のサブストリング

 

ねえ

 

これは、タイムアウトやスーパーメモリとなっています

その後、変更が、その後変更された答えが間違っています

そして、最終的位置はハッシュしないと結論付けました

 

アイムどこかにこれを見つけるために:

// 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(); 
    } 
}

 

 

 

ねえ...

 

おすすめ

転載: www.cnblogs.com/kkkek/p/11529899.html