爆搜 40pts 如何修改?
查看原帖
爆搜 40pts 如何修改?
597060
GGapa楼主2023/10/15 23:21
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
using namespace std;

int T;
int n;
set<vector<int> > mp;
struct Step {
    int i, j, k;
};
vector<Step> step;
bool flag = false;

void out() {
    cout << "Huoyu\n";
    cout << step.size() << "\n";
    for(auto i : step) {
        cout << i.i << " " << i.j << " " << i.k << "\n";
    }
}

void dfs(vector<int> x) {
    if(flag) return;
    if(x.size() == 1) {
        flag = true;
        out();
        return;
    }
    if(mp.count(x) || x.size() < 3) return;
    mp.insert(x);
    vector <int> tmp = x;
    int len = x.size();
    for(int i = 0; i < len; i++) 
        for(int j = i + 1; j < len; j++)
            for(int k = j + 1; k < len; k++) 
                if((x[i] ^ x[j] ^ x[k]) == 0) {
                    step.push_back(Step{i+1, j+1, k+1});
                    int s = 0;
                    for(int q = i; q <= k; q++) s ^= x[q];
                    x.insert(x.begin() + i, s);
                    x.erase(x.begin() + i + 1, x.begin() + k + 2);
                    dfs(x);
                    x = tmp;
                    step.pop_back();
                }
}

int main() {
    cin >> T;
    while(T--) {
        cin >> n;
        vector<int> a(n);
        mp.clear();
        step.clear();
        flag = false;
        for(auto &i : a) cin >> i;
        dfs(a);
        if(!flag) cout << "Shuiniao\n";
    }
    return 0;
}

2023/10/15 23:21
加载中...