Task: | Letter Game |
Sender: | Ukkonen Fan Club |
Submission time: | 2018-05-26 15:53:54 +0300 |
Language: | C++ |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.01 s | details |
#2 | ACCEPTED | 0.05 s | details |
#3 | ACCEPTED | 0.05 s | details |
#4 | ACCEPTED | 0.05 s | details |
#5 | ACCEPTED | 0.06 s | details |
#6 | ACCEPTED | 0.05 s | details |
#7 | ACCEPTED | 0.05 s | details |
#8 | ACCEPTED | 0.04 s | details |
#9 | ACCEPTED | 0.05 s | details |
#10 | ACCEPTED | 0.04 s | details |
#11 | ACCEPTED | 0.04 s | details |
#12 | ACCEPTED | 0.05 s | details |
#13 | ACCEPTED | 0.05 s | details |
#14 | ACCEPTED | 0.04 s | details |
#15 | ACCEPTED | 0.05 s | details |
#16 | ACCEPTED | 0.05 s | details |
#17 | ACCEPTED | 0.05 s | details |
#18 | ACCEPTED | 0.04 s | details |
#19 | ACCEPTED | 0.04 s | details |
Compiler report
input/code.cpp: In function 'int get_enc(std::vector<int>&)': input/code.cpp:9:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i < v.size(); ++i) { ~~^~~~~~~~~~ input/code.cpp: In function 'int f(int)': input/code.cpp:65:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i < que.size(); ++i) { ~~^~~~~~~~~~~~ input/code.cpp:72:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i < que.size(); ++i) { ~~^~~~~~~~~~~~ input/code.cpp:77:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i < v.size(); ++i) { ~~^~~~~~~~~~ input/code.cpp:83:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i + 1 < v.size(); ++i) { ~~~~~~^~~~~~~~~~ in...
Code
#include <bits/stdc++.h>using namespace std;const int MN = 1e7;//A = 0//B = 1//. = 2int get_enc(vector<int> & v) {int res = 0;for(int i = 0; i < v.size(); ++i) {res *= 3;res += v[i];}return res;}vector<int> get_vector(int x, int len) {vector<int> v(len);for(int i = 0; i < len; ++i) {v[len-i-1] = x % 3;x /= 3;}return v;}int pow(int a, int b) {int res = 1;for(int i = 0; i < b; ++i) {res *= a;}return res;}int visited[MN];int prv[MN];int f(int tot_len) {if(tot_len <= 2) {cout<<"FAIL\n";return 0;}int chars = tot_len-2;vector<int> v(tot_len);vector<int> que;for(int zeros = 0; zeros <= chars; ++zeros) {for(int e_pos = 0; e_pos+1 < tot_len; ++e_pos) {int c_pos = 0;for(int j = 0; j < tot_len; ++j) {if(j == e_pos || j == e_pos + 1) {v[j] = 2;}else {if(c_pos < zeros) {v[j] = 0;}else {v[j] = 1;}++c_pos;}}//for(auto x: v) cout<<"AB."[x]<<' ';//cout<<'\n';que.push_back(get_enc(v));}}//cout<<'\n';memset(visited, -1, sizeof visited);for(int i = 0; i < que.size(); ++i) {visited[que[i]] = 0;prv[que[i]] = que[i];vector<int> v = get_vector(que[i], tot_len);//for(auto x: v) cout<<"AB."[x]<<' ';//cout<<'\n';}for(int i = 0; i < que.size(); ++i) {vector<int> v = get_vector(que[i], tot_len);int dist = visited[que[i]];int prev_enc = que[i];int em_pos = 0;for(int i = 0; i < v.size(); ++i) {if(v[i] == 2) {em_pos = i;break;}}for(int i = 0; i + 1 < v.size(); ++i) {if(v[i] != 2 && v[i+1] != 2) {swap(v[i], v[em_pos]);swap(v[i+1], v[em_pos+1]);int enc = get_enc(v);if(visited[enc] == -1) {prv[enc] = prev_enc;visited[enc] = dist+1;que.push_back(enc);}swap(v[i], v[em_pos]);swap(v[i+1], v[em_pos+1]);}}}/*int lim = pow(3, tot_len);pair<int, int> ma = {0, 0};for(int i = 0; i < lim; ++i) {vector<int> v = get_vector(i, tot_len);int empty_cnt = 0;int a_cnt = 0;int b_cnt = 0;for(int i = 0; i < v.size(); ++i) {if(v[i] == 2) ++empty_cnt;if(v[i] == 0) ++a_cnt;if(v[i] == 1) ++b_cnt;}if(empty_cnt != 2 || a_cnt < 2 || b_cnt < 2) continue;int ok = 1;for(int i = 0; i < v.size(); ++i) {if(v[i] == 2 && v[i+1] != 2) {ok = 0;}if(v[i] == 2) break;}if(!ok) continue;if(visited[i] == -1) {cout<<"FAIL\n";for(auto x: v) cout<<"AB."[x];cout<<'\n';}ma = max(ma, {visited[i], i});}cout<<ma.first<<endl;vector<int> v2 = get_vector(ma.second, tot_len);for(auto x: v2) cout<<"AB."[x];cout<<'\n';*/}vector<string> ans;void move(string& str, int& a, int b) {swap(str[a], str[b]);swap(str[a+1], str[b+1]);ans.push_back(str);a = b;}int main() {int n;cin>>n;n *= 2;string s;cin>>s;if(n == 2) {cout<<0<<'\n';return 0;}int aas = 0;int bbs = 0;int dots = -1;for (int i = 0; i < s.size(); ++i) {char c = s[i];if (c == 'A') ++aas;if (c == 'B') ++bbs;if (c == '.' && dots == -1) dots = i;}int a = 0;int b = n - 1;while(true) {if(b - a+1 < 10) break;char t = (aas >= 4 ? 'A' : 'B');int i1 = (t == 'B' ? -1 : b + 1);if(t == 'A') {if(dots == a+1) {move(s, dots, dots+2);move(s, dots, a);}else if(dots >= a+2) {move(s, dots, a);}for (int i = a; i <= b; ++i) {if (s[i] == t) {if (t == 'A' && i < i1) i1 = i;}}move(s, dots, i1);++a;--aas;}if(t == 'B') {if(dots == b-2) {move(s, dots, dots-2);move(s, dots, b-1);}else if(dots <= b-3) {move(s, dots, b-1);}for (int i = a; i <= b; ++i) {if (s[i] == t) {if (t == 'B' && i1 < i) i1 = i;}}move(s, dots, i1-1);--b;--bbs;}}vector<int> v;for(int i = a; i <= b; ++i) {if(s[i] == 'A') v.push_back(0);if(s[i] == 'B') v.push_back(1);if(s[i] == '.') v.push_back(2);}f(b-a+1);int pos = get_enc(v);if(visited[pos] == -1) {cout<<-1<<'\n';return 0;}vector<int> states;while(1) {vector<int> v2 = get_vector(pos, b-a+1);/*for(auto x: v2) cout<<"AB."[x];cout<<'\n';*/int next_pos = prv[pos];//cout<<next_pos<<'\n';if(next_pos == pos) break;states.push_back(next_pos);pos = next_pos;}for(int i = 0; i < states.size(); ++i) {string s2;for(int j = 0; j < a; ++j) s2.push_back('A');vector<int> v = get_vector(states[i], b-a+1);for(auto x: v) s2.push_back("AB."[x]);for(int j = b+1; j < n; ++j) s2.push_back('B');ans.push_back(s2);}cout<<ans.size()<<'\n';for(int i = 0; i < ans.size(); ++i) {cout<<ans[i]<<'\n';}}
Test details
Test 1
Verdict: ACCEPTED
input |
---|
1 .. |
correct output |
---|
0 |
user output |
---|
0 |
Test 2
Verdict: ACCEPTED
input |
---|
2 A..B |
correct output |
---|
0 |
user output |
---|
0 |
Test 3
Verdict: ACCEPTED
input |
---|
2 B..A |
correct output |
---|
-1 |
user output |
---|
-1 |
Test 4
Verdict: ACCEPTED
input |
---|
3 AA..BB |
correct output |
---|
0 |
user output |
---|
0 |
Test 5
Verdict: ACCEPTED
input |
---|
3 AB..AB |
correct output |
---|
-1 |
user output |
---|
-1 |
Test 6
Verdict: ACCEPTED
input |
---|
3 AB..BA |
correct output |
---|
2 ABBA.. A..ABB |
user output |
---|
2 ABBA.. A..ABB |
Test 7
Verdict: ACCEPTED
input |
---|
3 BA..AB |
correct output |
---|
2 ..BAAB AAB..B |
user output |
---|
2 ..BAAB AAB..B |
Test 8
Verdict: ACCEPTED
input |
---|
3 BA..BA |
correct output |
---|
-1 |
user output |
---|
-1 |
Test 9
Verdict: ACCEPTED
input |
---|
3 BB..AA |
correct output |
---|
2 ..BBAA AABB.. |
user output |
---|
2 BBAA.. ..AABB |
Test 10
Verdict: ACCEPTED
input |
---|
100 BBABAABBBAAAAABBBBBBAAAABAAABA... |
correct output |
---|
140 ..ABAABBBAAAAABBBBBBAAAABAAABA... |
user output |
---|
388 ..ABAABBBAAAAABBBBBBAAAABAAABA... |
Test 11
Verdict: ACCEPTED
input |
---|
100 AABBABBAAABABBBBBBBBAABABAAAAB... |
correct output |
---|
142 AA..ABBAAABABBBBBBBBAABABAAAAB... |
user output |
---|
388 ..BBABBAAABABBBBBBBBAABABAAAAB... |
Test 12
Verdict: ACCEPTED
input |
---|
100 AAAAABAABBBABAABAAABABBAAAABAA... |
correct output |
---|
134 AAAAA..ABBBABAABAAABABBAAAABAA... |
user output |
---|
389 ..AAABAABBBABAABAAABABBAAAABAA... |
Test 13
Verdict: ACCEPTED
input |
---|
100 BBBAAAABAABABAABAABBBABBABABAA... |
correct output |
---|
142 ..BAAAABAABABAABAABBBABBABABAA... |
user output |
---|
388 ..BAAAABAABABAABAABBBABBABABAA... |
Test 14
Verdict: ACCEPTED
input |
---|
100 BABBBAAAAABABAAABBBAABBABABBBB... |
correct output |
---|
138 ..BBBAAAAABABAAABBBAABBABABBBB... |
user output |
---|
385 ..BBBAAAAABABAAABBBAABBABABBBB... |
Test 15
Verdict: ACCEPTED
input |
---|
100 ABAAAAABBAAAAAAAAAABABAABBBBBB... |
correct output |
---|
126 A..AAAABBAAAAAAAAAABABAABBBBBB... |
user output |
---|
401 ..AAAAABBAAAAAAAAAABABAABBBBBB... |
Test 16
Verdict: ACCEPTED
input |
---|
100 ABBBBBABBABABABBBABAABAAAABBAA... |
correct output |
---|
128 A..BBBABBABABABBBABAABAAAABBAA... |
user output |
---|
479 ..BBBBABBABABABBBABAABAAAABBAA... |
Test 17
Verdict: ACCEPTED
input |
---|
100 BAAABBABBAAAABABAAABABABBAAABA... |
correct output |
---|
139 ..AABBABBAAAABABAAABABABBAAABA... |
user output |
---|
387 ..AABBABBAAAABABAAABABABBAAABA... |
Test 18
Verdict: ACCEPTED
input |
---|
100 BBBBBABBAAABBAABBBBBABABABAABA... |
correct output |
---|
133 ..BBBABBAAABBAABBBBBABABABAABA... |
user output |
---|
386 ..BBBABBAAABBAABBBBBABABABAABA... |
Test 19
Verdict: ACCEPTED
input |
---|
100 BABBBBBBABBBABBBBBBAABABAAABAA... |
correct output |
---|
128 ..BBBBBBABBBABBBBBBAABABAAABAA... |
user output |
---|
389 ..BBBBBBABBBABBBBBBAABABAAABAA... |