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 //. = 2 int 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... |