求 Hack
查看原帖
求 Hack
515129
TLEWA楼主2024/10/12 20:29

如题。

#include<bits/stdc++.h>

using namespace std;

const int N=405;

int n,m;
vector<pair<int,char>> vec[N],fvec[N];

int f[N][N],s[N];
bitset<N> to[N],uvis[N];

pair<int,int> lst[N][N];
char mp[N][N];

queue<pair<int,int>> que;
int main() {
	cin >> n >> m;
	
	int u,v;char w;
	for(int i=1;i<=m;++i) {
		cin >> u >> v >> w;
		vec[u].push_back({v,w});
		fvec[v].push_back({u,w});
		mp[u][v]=w;
	}
	
	for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(i!=j) uvis[i][j]=1;
	for(int u=1;u<=n;++u) {
		for(auto& [v,w]:vec[u]) {
			uvis[u][v]=0,to[u][v]=1,f[u][v]=1;
			que.push({u,v});
		}
	}
	
	for(int u=1;u<=n;++u) {
		for(auto& [v,w]:vec[u]) {
			for(auto& [k,w2]:vec[v]) {
				if(w!=w2) continue;
				uvis[u][k]=0,f[u][k]=2;
				que.push({u,k});
			}
		}
	}
	
	bitset<N> B;
	while(!que.empty()) {
		auto& [u,v]=que.front();
		que.pop();
		
		for(auto& [q,w]:fvec[u]) {
			B=uvis[q]&to[v];
			for(int p=B._Find_first();p!=B.size();p=B._Find_next(p)) {
				if(w!=mp[v][p]) continue;
				uvis[q][p]=0,f[q][p]=f[u][v]+2;
				lst[q][p]={u,v};
				que.push({q,p});
			}
		}
	}
	
	int d;string s1;char c;
	cin >> d;
	cin >> s[1];
	for(int i=2;i<=d;++i) {
		cin >> s[i];
		if(!f[s[i-1]][s[i]]) {
			cout << -1 << endl;
			continue;
		}
		cout << f[s[i-1]][s[i]] << ' ';
		int u=s[i-1],v=s[i],nu,nv;s1="",c=' ';
		while(u&&v) {
			nu=lst[u][v].first,nv=lst[u][v].second;
			if(nu) s1+=mp[u][nu];
			else if(u!=v) c=mp[u][v];
			u=nu,v=nv;
		}
		cout << s1;
		if(c!=' ') cout << c;
		reverse(s1.begin(),s1.end());
		cout << s1 << endl;
	}
}
2024/10/12 20:29
加载中...