原題鏈結
發現 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,乙個用來當...