http://codeforces.com/contest/828
C题直接的思路是模拟把整个字符串都覆盖上去,已经覆盖的,就不需要再覆盖就是了。
这个套路出过很多次了,是一个类似并查集的东西,也就是并查集维护线段吧,我直接dfs回溯弄也可以。
设tonext[i]表示第i个位置的下一个空位是什么,
注意中间空的位置填上'a'就好
#include <bits/stdc++.h> #define IOS ios::sync_with_stdio(false) using namespace std; #define inf (0x3f3f3f3f) typedef long long int LL; const int maxn = 3e6 + 20; char str[maxn], sub[maxn]; int tonext[maxn], haha; int mx; void dfs(int cur, int pos, int lef) { mx = max(mx, haha); if (lef <= 0) return; if (tonext[cur] == cur) { str[cur] = sub[pos]; tonext[cur] = cur + 1; haha = cur + 1; dfs(cur + 1, pos + 1, lef - 1); } else { haha = tonext[cur]; dfs(tonext[cur], pos + tonext[cur] - cur, lef - (tonext[cur] - cur)); tonext[cur] = haha; } } void work() { for (int i = 1; i <= maxn - 20; ++i) tonext[i] = i; int n; cin >> n; for (int i = 1; i <= n; ++i) { cin >> sub + 1; int k; cin >> k; int lensub = strlen(sub + 1); for (int j = 1; j <= k; ++j) { int pos; cin >> pos; dfs(pos, 1, lensub); } } for (int i = 1; i < mx; ++i) { if (str[i] == '