제출 #861118

#제출 시각아이디문제언어결과실행 시간메모리
861118Alfraganus"The Lyuboyn" code (IZhO19_lyuboyn)C++14
52 / 100
1064 ms43504 KiB
#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define fs first
#define ss second
#define str string
#define all(a) a.begin(), a.end()
#define print(a)          \
    for (auto x : a)      \
        cout << x << ' '; \
    cout << endl;
#define each(x, a) for (auto x : a)

vector<int> ans;
vector<bool> used;
int n, k, t, sx = 0;

bool good(int s1, int s2){
    int ans = 0;
    while(s1 > 0 or s2 > 0){
        ans += (s1 % 2 != s2 % 2);
        s1 /= 2;
        s2 /= 2;
    }
    return ans == k;
}

bool dfs(int node, int step){
    if(step == (1 << n) - 1){
        if(t == 0){
            ans.push_back(node);
            return true;
        }
        if(good(sx, node))
            ans.push_back(node);
        else
            return false;
        return true;
    }
    used[node] = 1;
    if(k == 1 or k == 17){
        for (int i = 0; i < n; i++)
        {
            if (k == 1 and !used[node ^ (1 << i)] and dfs(node ^ (1 << i), step + 1))
            {
                ans.push_back(node);
                return true;
            }
            else if (k == 17 and !used[node ^ (node ^ (1 << i))] and dfs(node ^ (node ^ (1 << i)), step + 1))
            {
                ans.push_back(node);
                return true;
            }
        }
    }
    else if(k == 2 or k == 16){
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                if (k == 2 and !used[(node ^ (1 << i)) ^ (1 << j)] and dfs((node ^ (1 << i)) ^ (1 << j), step + 1))
                {
                    ans.push_back(node);
                    return true;
                }
                else if (k == 16 and !used[node ^ ((node ^ (1 << i)) ^ (1 << j))] and dfs(node ^ ((node ^ (1 << i)) ^ (1 << j)), step + 1)){
                    ans.push_back(node);
                    return true;
                }
            }
        }
    }
    else if(k == 3 or k == 15){
        for(int i = 0; i < n; i ++){
            for(int j = i + 1; j < n; j ++){
                for(int x = j + 1; x < n; x ++){
                    if (k == 3 and !used[((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)] and dfs(((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x), step + 1))
                    {
                        ans.push_back(node);
                        return true;
                    }
                    else if (k == 15 and !used[(node ^ ((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x))] and dfs(node ^ (((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)), step + 1)){
                        ans.push_back(node);
                        return true;
                    }
                }
            }
        }
    }
    else if (k == 4 or k == 14)
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                for (int x = j + 1; x < n; x++)
                {
                    for(int i1 = x + 1; i1 < n; i1 ++){
                        if (k == 4 and !used[(((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)] and dfs((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1), step + 1))
                        {
                            ans.push_back(node);
                            return true;
                        }
                        else if (k == 14 and !used[node ^ ((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1))] and dfs(node ^ ((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)), step + 1))
                        {
                            ans.push_back(node);
                            return true;
                        }
                    }
                }
            }
        }
    }
    else if(k == 5 or k == 13){
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                for (int x = j + 1; x < n; x++)
                {
                    for (int i1 = x + 1; i1 < n; i1++)
                    {
                        for(int i2 = i1 + 1; i2 < n; i2 ++){
                            if (k == 5 and !used[((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)] and dfs(((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2), step + 1))
                            {
                                ans.push_back(node);
                                return true;
                            }
                            else if (k == 13 and !used[node ^ (((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2))] and dfs(node ^ (((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)), step + 1))
                            {
                                ans.push_back(node);
                                return true;
                            }
                        }
                    }
                }
            }
        }
    }
    else if (k == 6 or k == 12)
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                for (int x = j + 1; x < n; x++)
                {
                    for (int i1 = x + 1; i1 < n; i1++)
                    {
                        for (int i2 = i1 + 1; i2 < n; i2++)
                        {
                            for(int i3 = i2 + 1; i3 < n; i3 ++){
                                if (k == 12 and !used[node ^ ((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3))] and dfs(node ^ ((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)), step + 1))
                                {
                                    ans.push_back(node);
                                    return true;
                                }
                                else if (k == 6 and !used[((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3))] and dfs(((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)), step + 1)){
                                    ans.push_back(node);
                                    return true;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    else if(k == 7 or k == 11){
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                for (int x = j + 1; x < n; x++)
                {
                    for (int i1 = x + 1; i1 < n; i1++)
                    {
                        for (int i2 = i1 + 1; i2 < n; i2++)
                        {
                            for (int i3 = i2 + 1; i3 < n; i3++)
                            {
                                for(int i4 = i3 + 1; i4 < n; i4 ++){
                                    if (k == 7 and !used[((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)) ^ (1 << i4)] and dfs(((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)) ^ (1 << i4), step + 1))
                                    {
                                        ans.push_back(node);
                                        return true;
                                    }
                                    else if (k == 11 and !used[node ^ (((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)) ^ (1 << i4))] and dfs(node ^ (((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)) ^ (1 << i4)), step + 1)){
                                        ans.push_back(node);
                                        return true;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    else if (k == 8 or k == 10)
    {
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                for (int x = j + 1; x < n; x++)
                {
                    for (int i1 = x + 1; i1 < n; i1++)
                    {
                        for (int i2 = i1 + 1; i2 < n; i2++)
                        {
                            for (int i3 = i2 + 1; i3 < n; i3++)
                            {
                                for (int i4 = i3 + 1; i4 < n; i4++)
                                {
                                    for(int i5 = i4 + 1; i5 < n; i5 ++){
                                        if (k == 8 and !used[(((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)) ^ (1 << i4)) ^ (1 << i5)] and dfs((((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)) ^ (1 << i4)) ^ (1 << i5), step + 1))
                                        {
                                            ans.push_back(node);
                                            return true;
                                        }
                                        else if (k == 10 and !used[node ^ ((((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)) ^ (1 << i4)) ^ (1 << i5))] and dfs(node ^ ((((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)) ^ (1 << i4)) ^ (1 << i5)), step + 1)){
                                            ans.push_back(node);
                                            return true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    else if(k == 9){
        for (int i = 0; i < n; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                for (int x = j + 1; x < n; x++)
                {
                    for (int i1 = x + 1; i1 < n; i1++)
                    {
                        for (int i2 = i1 + 1; i2 < n; i2++)
                        {
                            for (int i3 = i2 + 1; i3 < n; i3++)
                            {
                                for (int i4 = i3 + 1; i4 < n; i4++)
                                {
                                    for (int i5 = i4 + 1; i5 < n; i5++)
                                    {
                                        for(int i6 = i5 + 1; i6 < n; i6 ++){
                                            if (!used[((((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)) ^ (1 << i4)) ^ (1 << i5)) ^ (1 << i6)] and dfs(((((((((node ^ (1 << i)) ^ (1 << j)) ^ (1 << x)) ^ (1 << i1)) ^ (1 << i2)) ^ (1 << i3)) ^ (1 << i4)) ^ (1 << i5)) ^ (1 << i6), step + 1))
                                            {
                                                ans.push_back(node);
                                                return true;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    used[node] = 0;
    return false;
}

void solve(){
    cin >> n >> k >> t;
    str s;
    cin >> s;
    for(int i = s.size() - 1; i >= 0; i --){
        if(s[i] == '1'){
            sx += (1 << (s.size() - 1 - i));
        }
    }
    if(k % 2 == 0){
        cout << -1;
        return;
    }
    used.resize((1 << n));
    if(dfs(sx, 0)){
        cout << (1 << n) << endl;
        reverse(all(ans));
        for(int i = 0; i < ans.size(); i ++){
            str s = "";
            for(int j = 0; j < n; j ++){
                if(ans[i] % 2 == 0)
                    s += '0';
                else
                    s += '1';
                ans[i] >>= 1;
            }
            reverse(all(s));
            cout << s << endl;
        }
    }
    else{
        cout << -1;
    }
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
        cout << endl;
    }
}

컴파일 시 표준 에러 (stderr) 메시지

lyuboyn.cpp: In function 'void solve()':
lyuboyn.cpp:290:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  290 |         for(int i = 0; i < ans.size(); i ++){
      |                        ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...