嘟嘟嘟
現在看來這道題還不是特別難。
別一看到字串就想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,乙個用來當...