QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#238629 | #7686. The Phantom Menace | ucup-team1951# | WA | 1197ms | 11148kb | C++20 | 4.8kb | 2023-11-04 17:09:45 | 2023-11-04 17:09:45 |
Judging History
你现在查看的是最新测评结果
- [2024-10-08 14:11:03]
- hack成功,自动添加数据
- (/hack/941)
- [2024-10-08 10:05:28]
- hack成功,自动添加数据
- (/hack/940)
- [2024-10-07 19:51:15]
- hack成功,自动添加数据
- (/hack/938)
- [2024-10-07 19:28:01]
- hack成功,自动添加数据
- (/hack/937)
- [2024-10-07 17:16:32]
- hack成功,自动添加数据
- (/hack/936)
- [2024-10-07 16:53:09]
- hack成功,自动添加数据
- (/hack/935)
- [2024-10-07 16:22:17]
- hack成功,自动添加数据
- (/hack/934)
- [2023-11-09 15:33:42]
- hack成功,自动添加数据
- (//qoj.ac/hack/445)
- [2023-11-04 17:09:45]
- 提交
answer
#include <algorithm>
#include <iostream>
#include <vector>
#include <unordered_map>
using ll = long long;
using ull = unsigned long long;
using u128 = __uint128_t;
constexpr ull mod = (1ULL << 61) - 1;
constexpr ull base = 314159265ULL;
std::vector<ull> base_pow;
inline ull add(ull a, ull b) {
a += b;
if (a >= mod) a -= mod;
return a;
}
inline ull mul(ull a, ull b) {
u128 t = (u128)a * b;
ull na = t >> 61;
ull nb = t & mod;
return add(na, nb);
// return (u128)a * b % mod;
}
void init_base_pow() {
int max_len = 1e6 + 10;
base_pow.resize(max_len);
base_pow[0] = 1;
for (int i = 1; i < max_len; i++) {
base_pow[i] = base_pow[i - 1] * base % mod;
}
}
struct Hash {
int n;
std::vector<ull> h;
Hash(std::string &s) {
n = s.size();
h.resize(n + 1);
for (int i = 0; i < n; i++) {
h[i + 1] = add(mul(h[i], base), s[i]);
}
}
ull get(int l, int r) {
return add(h[r], mod - mul(h[l], base_pow[r - l]));
}
};
// struct UF {
// std::unordered_map<ull, std::tuple<ull, int, int>> uf; // parent, size, count
// UF() {}
// void add(ull x) {
// if (!uf.contains(x)) uf[x] = {x, 1, 0};
// }
// ull find(ull x) {
// if (std::get<0>(uf[x]) == x) return x;
// return std::get<0>(uf[x]) = find(std::get<0>(uf[x]));
// }
// void unite(ull x, ull y) {
// add(x);
// add(y);
// std::get<2>(uf[x])++;
// std::get<2>(uf[y])++;
// x = find(x);
// y = find(y);
// if (x == y) return;
// if (std::get<1>(uf[x]) < std::get<1>(uf[y])) std::swap(x, y);
// std::get<0>(uf[y]) = x;
// std::get<1>(uf[x]) += std::get<1>(uf[y]);
// }
// };
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<Hash> hs, ht;
for (int i = 0; i < n; i++) {
std::string s;
std::cin >> s;
hs.emplace_back(s);
}
for (int i = 0; i < n; i++) {
std::string t;
std::cin >> t;
ht.emplace_back(t);
}
for (int i = 0; i <= m; i++) {
std::unordered_map<ull, std::vector<std::pair<ull, int>>> graph;
std::unordered_map<ull, int> in_count;
int j = 0;
for (Hash &h: hs) {
ull a = h.get(0, i) * 2;
ull b = h.get(i, m) * 2 + 1;
// std::cout << "hashs " << "i " << i << " " << a << " " << b << "\n";
graph[a].emplace_back(b, j++);
in_count[b]++;
}
for (Hash &h: ht) {
ull a = h.get(0, m - i) * 2 + 1;
ull b = h.get(m - i, m) * 2;
// std::cout << "hasht " << "i " << i << " " << a/ << " " << b << "\n";
graph[a].emplace_back(b, j++);
in_count[b]++;
}
bool ok = true;
for (auto &[x, cnt]: in_count) {
if (graph[x].size() != cnt) {
// std::cout << "test_ " << i << " " << x << " " << graph[x].size() << " " << cnt << "\n";
ok = false;
break;
}
}
if (!ok) {
// std::cout << "test " << i << "\n";
continue;
}
ull from = graph.begin()->first;
std::vector<int> path, back_path;
// construct euler path
auto dfs = [&](auto &&self, ull x) -> void {
if (graph[x].empty()) {
if (x != from) {
path.insert(path.end(), back_path.begin(), back_path.end());
back_path.clear();
}
} else {
while (!graph[x].empty()) {
auto [y, id] = graph[x].back();
graph[x].pop_back();
back_path.push_back(id);
self(self, y);
}
}
};
dfs(dfs, from);
path.insert(path.end(), back_path.begin(), back_path.end());
if (path.size() != 2 * n) {
// std::cout << "test2 " << i << "\n";
continue;
}
// std::reverse(path.begin(), path.end());
std::vector<int> a, b;
for (int e: path) {
if (e < n) {
a.push_back(e);
} else {
b.push_back(e - n);
}
}
for (int j: a) {
std::cout << j + 1 << " ";
}
std::cout << "\n";
for (int j: b) {
std::cout << j + 1 << " ";
}
std::cout << "\n";
return;
}
std::cout << "-1\n";
}
int main() {
// std::ios_base::sync_with_stdio(false);
// std::cin.tie(nullptr);
init_base_pow();
int t;
std::cin >> t;
while (t--) solve();
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 3ms
memory: 10812kb
input:
2 3 3 abc ghi def bcd efg hia 1 3 abc def
output:
1 3 2 3 1 2 -1
result:
ok 2 cases (2 test cases)
Test #2:
score: 0
Accepted
time: 1197ms
memory: 11112kb
input:
1000000 1 1 b b 1 1 a b 1 1 b a 1 1 a a 1 1 b b 1 1 a b 1 1 b a 1 1 a a 1 1 b b 1 1 a b 1 1 b a 1 1 a a 1 1 b b 1 1 a b 1 1 b a 1 1 a a 1 1 b b 1 1 a b 1 1 b a 1 1 a a 1 1 b b 1 1 a b 1 1 b a 1 1 a a 1 1 b b 1 1 a b 1 1 b a 1 1 a a 1 1 b b 1 1 a b 1 1 b a 1 1 a a 1 1 b b 1 1 a b 1 1 b a 1 1 a a 1 1 ...
output:
1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 -1 ...
result:
ok 1000000 cases (1000000 test cases)
Test #3:
score: 0
Accepted
time: 662ms
memory: 11064kb
input:
500000 1 2 dd ba 1 2 cd ba 1 2 bd ba 1 2 ad ba 1 2 dc ba 1 2 cc ba 1 2 bc ba 1 2 ac ba 1 2 db ba 1 2 cb ba 1 2 bb ba 1 2 ab ba 1 2 da ba 1 2 ca ba 1 2 ba ba 1 2 aa ba 1 2 dd aa 1 2 cd aa 1 2 bd aa 1 2 ad aa 1 2 dc aa 1 2 cc aa 1 2 bc aa 1 2 ac aa 1 2 db aa 1 2 cb aa 1 2 bb aa 1 2 ab aa 1 2 da aa 1 2...
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 ...
result:
ok 500000 cases (500000 test cases)
Test #4:
score: 0
Accepted
time: 800ms
memory: 11148kb
input:
500000 2 1 d d b a 2 1 c d b a 2 1 b d b a 2 1 a d b a 2 1 d c b a 2 1 c c b a 2 1 b c b a 2 1 a c b a 2 1 d b b a 2 1 c b b a 2 1 b b b a 2 1 a b b a 2 1 d a b a 2 1 c a b a 2 1 b a b a 2 1 a a b a 2 1 d d a a 2 1 c d a a 2 1 b d a a 2 1 a d a a 2 1 d c a a 2 1 c c a a 2 1 b c a a 2 1 a c a a 2 1 d...
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 1 1 2 -1 -1 2 1 1 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 1 2 1 2 1 2 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 1 2 1 -1 -1 2 1 2 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 1 2 1 -1 -1 -1 -1 -1 2 1 2 1 -1 -1 -1 -1 -1 -1 -1 -1 -...
result:
ok 500000 cases (500000 test cases)
Test #5:
score: 0
Accepted
time: 543ms
memory: 11136kb
input:
333333 1 3 cbb bfa 1 3 bbb bfa 1 3 abb bfa 1 3 fab bfa 1 3 eab bfa 1 3 dab bfa 1 3 cab bfa 1 3 bab bfa 1 3 aab bfa 1 3 ffa bfa 1 3 efa bfa 1 3 dfa bfa 1 3 cfa bfa 1 3 bfa bfa 1 3 afa bfa 1 3 fea bfa 1 3 eea bfa 1 3 dea bfa 1 3 cea bfa 1 3 bea bfa 1 3 aea bfa 1 3 fda bfa 1 3 eda bfa 1 3 dda bfa 1 3 c...
output:
-1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
result:
ok 333333 cases (333333 test cases)
Test #6:
score: -100
Wrong Answer
time: 693ms
memory: 11064kb
input:
333333 3 1 c b b b f a 3 1 b b b b f a 3 1 a b b b f a 3 1 f a b b f a 3 1 e a b b f a 3 1 d a b b f a 3 1 c a b b f a 3 1 b a b b f a 3 1 a a b b f a 3 1 f f a b f a 3 1 e f a b f a 3 1 d f a b f a 3 1 c f a b f a 3 1 b f a b f a 3 1 a f a b f a 3 1 f e a b f a 3 1 e e a b f a 3 1 d e a b f a 3 1 c...
output:
-1 -1 -1 3 2 1 2 1 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 2 1 2 3 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 2 1 2 3 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 2 1 2 3 1 -1 -1 -1 -1 -...
result:
wrong answer not cyclic isomorphism (test case 14)