NOI2017蚯蚓排隊

2022-05-16 02:07:37 字數 1629 閱讀 4677

原題鏈結

發現 k<=50 ,在插入和刪除時最多會影響不超過 k2 個串,用鍊錶實現插入和刪除,然後只需用雜湊表維護每個長度不超過k的串的出現次數,雜湊的話可以先用比較大的範圍的值處理衝突,再對映到1e8的桶裡統計。

考慮複雜度。

首先在刪除時由於保證了 c<=1000 所以這部分複雜度是o(ck2)的。

插入時,如果插入操作很慢只有可能是連線兩個長度不小於k的串,而長度不小於k的串最多有n/k個,所以這部分複雜度是o(nk)的

所以總複雜度是o(nk+ck2+|s|)。

#include#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

inline

void read(int &re)

re=0

;

while(ch<='

9'&&ch>='

0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();

re*=g;

}typedef

long

long

ll;typedef

double

db;typedef unsigned

long

long

ul;const ul bas=7u

;const ll mod=998244353

;const ul mod2=99999971u

;const

int n=200050

;int head[n],tail[n],cnt=0,nex[20050000],fir[100000000

];int num[20050000

];ul hax[

20050000

];char

leng[n];

inline ul qpow(ul a,

intn)

inline

void

insert(ul x)

if(hax[u]==x)

while

(nex[u])

}cnt++;

nex[u]=cnt;

hax[cnt]=x; num[cnt]++;}

inline

void

del(ul x)

u=nex[u];

}} inline

intquery(ul x)

return0;

}char a[10000050

];int

n,m;

intmain()

while(m--)}}

}else

if(opt==2) //

--x || y--}}

head[y]=0;tail[x]=0

; }

else

printf(

"%lld\n

",ans);}}

return0;

}

NOI2017 蚯蚓排隊

嘟嘟嘟 現在看來這道題還不是特別難。別一看到字串就想sam 看到 k 很小,所以我們可以搞乙個單次修改複雜度跟 k 有關的演算法。能想到,每一次斷開或鏈結,最多隻會影響 k 2 個長度為 k 的區間。所以我們開乙個雜湊表,每一次拼接時就往雜湊表裡加入 k 2 個新的雜湊值,斷鏈的時候就把這些雜湊值減...

Luogu3823 NOI2017 蚯蚓排隊

題面 luogu3823 題意 n nn只蚯蚓,每只蚯蚓有乙個 6 le 6 6的長度,初始時每只蚯蚓一支隊伍。給出m mm個操作。三種操作 將以i ii結尾的隊伍和以j jj開頭的隊伍合併,且i ii的隊伍在前。將i ii和i ii後面乙隻蚯蚓處斷開,分為兩支隊伍。定義以第x xx只蚯蚓開始的長度...

LOJ 2303 NOI2017 蚯蚓排隊

n leq 200000 的 1 leq a i leq 6 的蚯蚓,有三種操作 讓乙隻隊頭蚯蚓接在乙隻隊尾蚯蚓後面 讓一隊蚯蚓從某個蚯蚓後面斷成兩隊 問 給個字串,問他的。算了你們直接看題吧 這什麼沙雕題qaq 所有詢問的串只有 nk 種,把他們全丟進hash裡面就好了。注意雙hash,乙個用來當...