NOI2017 蚯蚓排隊

2022-05-09 10:36:06 字數 1435 閱讀 1837

嘟嘟嘟

現在看來這道題還不是特別難。

別一看到字串就想sam

看到\(k\)很小,所以我們可以搞乙個單次修改複雜度跟\(k\)有關的演算法。

能想到,每一次斷開或鏈結,最多隻會影響\(k ^ 2\)個長度為\(k\)的區間。所以我們開乙個雜湊表,每一次拼接時就往雜湊表裡加入\(k ^ 2\)個新的雜湊值,斷鏈的時候就把這些雜湊值減去。然後查詢的時候只要掃一遍\(s\),每遇到長度為\(k\)的子串就再查一下。

具體的操作要用到鍊錶,對於每乙個節點分別維護乙個pre和suf指標即可。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define enter puts("")

#define space putchar(' ')

#define mem(a, x) memset(a, x, sizeof(a))

#define in inline

typedef long long ll;

typedef unsigned long long ull;

typedef double db;

const int inf = 0x3f3f3f3f;

const db eps = 1e-8;

const ll mod = 998244353;

const int maxn = 2e5 + 5;

const int maxm = 2e7 + 5;

const int lim = 50;

const ull num = 233;

const ull p = 19260817;

inline ll read()

inline void write(ll x)

in void myfile()

char s[maxm];

int n, m, a[maxn];

struct hash

nxt[++tot] = head[h], to[tot] = x, val[tot] = sum, head[h] = tot;

} in int query(ull x)

}h;ull p[maxn];

int pre[maxn], suf[maxn];

in void merge(int x, int y)

}}in void split(int x)

}suf[x] = 0, pre[y] = 0;

}in ll query(const int& k)

}return ret;

}int main()

else if(op == 2)

else

}return 0;

}

NOI2017蚯蚓排隊

原題鏈結 發現 k 50 在插入和刪除時最多會影響不超過 k2 個串,用鍊錶實現插入和刪除,然後只需用雜湊表維護每個長度不超過k的串的出現次數,雜湊的話可以先用比較大的範圍的值處理衝突,再對映到1e8的桶裡統計。考慮複雜度。首先在刪除時由於保證了 c 1000 所以這部分複雜度是o ck2 的。插入...

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,乙個用來當...