WA 40pts求调
查看原帖
WA 40pts求调
760433
zcz0263楼主2024/11/3 16:01
#include<bits/stdc++.h>
using namespace std;
#define vi vector<int>
#define vvi vector<vi>
#define eb emplace_back
#define pob pop_back
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define tomn(x,...) ((x)=min((x),__VA_ARGS__))
#define all(x) x.begin(),x.end()


struct node{
    int i;
    char hi;
    int j;
    char hj;
    node(int a=0,char b=0,int c=0,char d=0):i(a),hi(b),j(c),hj(d){}
};
#define N 200005
vector<node>a;
vvi g(N);
int dnt,cnt,m;
vi sta,dfn(N),low(N),tmp(N);
bitset<N> vis;
string s;
map<pair<char,char>,int> mp;
map<pair<char,int>,char> up;
int n,d;
#define to(x,y) ((y)*n+(x))
void tarjan(int u){
    dfn[u]=low[u]=++dnt;
    sta.eb(u);
    vis[u]=1;
    for(int&v:g[u]){
        if(!dfn[v]){
            tarjan(v);
            tomn(low[u],low[v]);
        }else if(vis[v]) tomn(low[u],dfn[v]);
    }
    if(low[u]==dfn[u]){
        int v=-1;
        ++cnt;
        for(;u^v;){
            vis[v=sta.back()]=0;
            sta.pob();
            tmp[v]=cnt;
        }
    }
}
bool hv=0;
void solve(){
    vis=0;
    cnt=dnt=0;
    fill(all(dfn),0);
    fill(all(low),0);
    fill(all(tmp),0);
    sta.clear();
    for(auto&i:g) i.clear();
//    cout<<"edge:\n";
    for(auto&[i,hi,j,hj]:a){
        if(s[i]==hi) continue;
        if(i==j&&hi==hj) continue;
        if(s[j]==hj||i==j){
            g[to(i,(mp[{s[i],hi}]))].eb(to(i,(!mp[{s[i],hi}])));
//            cout<<" "<<i<<hi<<" "<<i<<char(up[{s[i],(!mp[{s[i],hi}])}])<<"\n";
            continue;
        }
        g[to(i,(mp[{s[i],hi}]))].eb(to(j,(mp[{s[j],hj}])));
        g[to(j,(!mp[{s[j],hj}]))].eb(to(i,(!mp[{s[i],hi}])));
//        cout<<" "<<i<<hi<<" "<<j<<hj<<"\n";
//        cout<<" "<<i<<up[{s[j],(!mp[{s[j],hj}])}]<<" "<<j<<up[{s[i],(!mp[{s[i],hi}])}]<<"\n";
    }
    rep(i,1,2*n) if(!dfn[i]) tarjan(i);
//    cout<<"mp: ";
//    rep(i,1,2*n){
//        cout<<"debug: "<<s[(i-1)%n+1]<<" "<<(i-1)/n<<"\n";
//        cout<<"mp["<<(i-1)%n+1<<char(up[{s[(i-1)%n+1],(i-1)/n}])<<"]: "<<tmp[i]<<"\n";
//    }
    rep(i,1,n){
        if(tmp[i]==tmp[i+n]){
            return;
        }
    }
    rep(i,1,n){
        int temp=(tmp[i]>tmp[i+n]);
        cout<<up[{s[i],temp}];
    }
    exit(0);
}
vi xp(1);
main(){
#ifdef LOCAL
    auto start=clock();
#endif
    ios::sync_with_stdio(0),cin.tie(nullptr);
    cin>>n>>d>>s;
    s=" "+s;
    rep(i,1,n){
        if(s[i]=='x'){
            xp.eb(i);
        }
    }
    mp[{'a','B'}]=0;
    mp[{'a','C'}]=1;
    mp[{'b','A'}]=0;
    mp[{'b','C'}]=1;
    mp[{'c','A'}]=0;
    mp[{'c','B'}]=1;

    up[{'a',0}]='B';
    up[{'a',1}]='C';
    up[{'b',0}]='A';
    up[{'b',1}]='C';
    up[{'c',0}]='A';
    up[{'c',1}]='B';
    cin>>m;
    a.resize(m);
    for(auto&[i,hi,j,hj]:a){
        cin>>i>>hi>>j>>hj;
    }
    rep(i,0,(1<<d)-1){
        rep(j,1,d){
            if((i>>(j-1))&1){
                s[xp[j]]='a';
            }else s[xp[j]]='b';
        }
        solve();
    }
    cout<<-1;
#ifdef LOCAL
    clog<<"\ntime: "<<clock()-start<<" ms\n";
#endif
}

2024/11/3 16:01
加载中...