Submission #1319178

#TimeUsernameProblemLanguageResultExecution timeMemory
1319178mehraliiKOVANICE (COI15_kovanice)C++20
50 / 100
2096 ms45052 KiB
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>

using namespace std;
// using namespace __gnu_pbds;

// template <typename T>
// using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define int long long
#define pb push_back
#define eb emplace_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define ins insert
#define ff first
#define ss second

// mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

constexpr int inf = 1e15, mod = 998244353, maxn = 1000005;

int n, m, V;
vector<vector<int>> g1, g;
vector<int> compress, res;
vector<bool> vis;

vector<vector<int>> rr;

void dfs1(int u, int id){
	vis[u]=true;
	compress[u]=id;
	rr[id].pb(u);
	for (int v: g1[u]){
		if (!vis[v]){
			dfs1(v, id);
		}
	}
}

vector<int> a, par;
void dfs(int u, int d=1){
	if (res[u] < 0){
		a.pb(u);
	}

	if (d==n){
		for (int i = 0; i < a.size(); i++){
			res[a[i]]=res[par[a[i]]]+1;
		}
		a.clear();
	}

	for (int v: g[u]){
		if (v!=par[u]){
			par[v]=u;
			dfs(v, d+1);
		}
	}

	if (!a.empty() && a.back()==u){
		a.ppb();		
	}
}

void solve(){
	cin >> n >> m >> V;

	vector<pair<int,int>> edges;
	g1.assign(m+1, vector<int>());
	compress.assign(m+1, -1);
	rr.assign(m+1, vector<int>());
	vis.assign(m+1, true);
	
	for (int i = 0; i < V; i++){
		int u=0, v=0;
		char cc='*';
		string l;
		cin >> l;
		for (char c: l){
			if ('0'<=c&&c<='9'){
				if (cc=='*'){
					u*=10;
					u+=(c-'0');
				} else{
					v*=10;
					v+=(c-'0');
				}
			} else{
				cc=c;
			}
		}
		if (cc=='='){
			g1[u].pb(v);
			g1[v].pb(u);
			vis[u]=vis[v]=false;
		} else{
			edges.eb(u, v);
		}
	}

	for (int u = 1; u <= m; u++){
		if (!vis[u]){
			dfs1(u, u);
		}
	}

	g.assign(m+1, vector<int>());
	vector<int> in(m+1, 0);
	for (auto [u, v]: edges){
		if (0<compress[u]&&0<compress[v]){
			g[compress[u]].pb(compress[v]);
			in[compress[v]]++;
		} else if (0<compress[u]){
			g[compress[u]].pb(v);
			in[v]++;
		} else if (0<compress[v]){
			g[u].pb(compress[v]);
			in[compress[v]]++;
		}  else{
			g[u].pb(v);
			in[v]++;
		}
	}

	res.assign(m+1, -1);
	par.assign(m+1, 0);
	res[0]=0;
	for (int u = 1; u <= m; u++){
		if (!in[u]){
			dfs(u);
		}
	}

	for (int i = 1; i <= m; i++){
		for (int v: rr[i]){
			res[v] = res[i];
		}
	}

	for (int i = 1; i <= m; i++){
		if (res[i]<0){
			cout << "?\n";
		} else{
			cout << "K" << res[i] << '\n';
		}
	}
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    // cin >> t;

    for (int i = 0; i < t; i++) {
        solve();
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...