QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#115917 | #6507. Recover the String | jzh | RE | 0ms | 3452kb | C++14 | 3.0kb | 2023-06-27 18:37:02 | 2023-06-27 18:37:05 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
int n, m;
vector<vector<int>> graph, hparg;
struct Str {
int head, tail;
int pre, suf;
};
int main() {
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--) {
cin >> n >> m;
graph.assign(n + 5, {});
hparg.assign(n + 5, {});
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v;
u--, v--;
graph[u].push_back(v);
hparg[v].push_back(u);
}
vector<int> ds(n + 5, -1);
vector<vector<int>> uss(n + 5);
for (int u = 0; u < n; ++u)
if (hparg[u].empty()) {
uss[ds[u] = 1].push_back(u);
}
for (int d = 1; d < n; ++d) {
for (const int u: uss[d]) {
for (const int v: graph[u]) {
if (!~ds[v]) {
uss[ds[v] = d + 1].push_back(v);
}
}
}
}
const int L = *max_element(ds.begin(), ds.end());
uss.resize(L + 5);
int V = 0;
vector<Str> ss(4 * n + 1);
vector<vector<int>> xss(n + 5);
for (const int u: uss[1]) {
const int x = V++;
ss[x] = Str{x, x, -1, -1};
xss[u].push_back(x);
}
for (int d = 2; d <= L; ++d) {
for (const int u: uss[d]) {
vector<pair<int, int>> ps;
auto check = [&](int vL, int vR) -> void {
for (const int xL: xss[vL])
for (const int xR: xss[vR]) {
if (ss[xL].suf == ss[xR].pre) {
ps.emplace_back(xL, xR);
}
}
};
if (hparg[u].size() == 1) {
check(hparg[u][0], hparg[u][0]);
} else if (hparg[u].size() == 2) {
check(hparg[u][0], hparg[u][1]);
check(hparg[u][1], hparg[u][0]);
} else {
}
sort(ps.begin(), ps.end());
ps.erase(unique(ps.begin(), ps.end()), ps.end());
for (auto [sl, sr]: ps) {
const int x = V++;
ss[x] = Str{ss[sl].head, ss[sr].tail, sl, sr};
xss[u].push_back(x);
}
sort(xss[u].begin(), xss[u].end());
xss[u].erase(unique(xss[u].begin(), xss[u].end()), xss[u].end());
}
}
string ans = "~";
for (const int x: xss[uss[L][0]]) {
string s(L, '?');
char c = 'a';
vector<char> tr(L, 0);
int y = x;
for (int i = 0; i < L; ++i) {
int a = ss[y].head;
if (!tr[a]) tr[a] = c++;
s[i] = tr[a];
y = ss[y].suf;
}
ans = min(ans, s);
}
cout << ans << "\n";
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3452kb
input:
3 1 0 5 6 2 4 2 5 5 3 4 3 1 5 1 4 8 11 1 2 1 4 1 6 2 5 3 4 3 6 4 5 4 7 5 8 6 7 7 8
output:
a aba aaba
result:
ok 3 lines
Test #2:
score: -100
Dangerous Syscalls
input:
26837 1 0 2 1 2 1 3 2 1 3 2 3 3 2 3 1 1 2 5 5 4 3 5 1 1 2 3 2 5 3 5 6 2 4 2 5 5 3 4 3 1 5 1 4 5 5 1 5 2 1 2 4 4 5 3 4 6 6 1 4 5 3 2 4 4 6 3 6 2 3 4 3 1 3 3 4 2 1 7 8 2 5 1 3 7 1 3 5 7 6 1 2 4 6 6 3 8 11 2 6 2 7 3 7 8 1 6 4 4 5 7 4 7 1 3 8 2 8 1 5 8 10 8 1 4 5 7 8 3 5 3 1 7 3 1 2 5 2 6 4 6 3 9 11 5 2...
output:
a aa ab aaa aab aba aab abc aaaa aaab aaba aabb aabc aaba abab abac abba aaab abbc abca abac aabc abcd aaaaa aaaab aaaba aaabb aaabc aabaa aabab aabac aabba aaabb aabbc aabca aabcb aabcc aabcd aaaba abaab abaac ababa aabab ababc abaca abacb aabcb abacd aabba abaab abbac abbba aaaab abbbc abbca abaac...