WA on #12 求条
查看原帖
WA on #12 求条
995952
Inter12楼主2025/2/5 14:19
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 50005, M = 555;

struct node
{
	int y, id;
};

vector<node> nbr[N];

map<string, int> Mapst;
map<string, int> Maped;

int n, k, mth[N], cntst, cnted, ans, as, Tsn[N], tim, dfn[N], out[N];

string s[N];

bool vis[N], visn[N];

void dfs(int cur, bool flag, int ti)
{
	vis[cur] = true;
	for(int i = 0; i < nbr[cur].size(); i++)
	{
		int nxt = nbr[cur][i].y;
		if(vis[nxt])
			continue;
		dfs(nxt, !flag, ti);
		if(flag)
			Tsn[++as] = nxt;
	}
	return ;
}

bool hungary(int cur, int ti)
{
	for(auto E : nbr[cur])
	{
		int nxt = E.y;
		if(dfn[nxt] == ti)
			continue;
		dfn[nxt] = ti;
		if(!mth[nxt] || hungary(mth[nxt], ti))
		{
			mth[nxt] = cur;
			return true;
		}
	}
	return false;
}

signed main()
{
	cin >> n >> k;
	for(int i = 1; i <= n; i++)
	{
		cin >> s[i];
		string st = s[i].substr(0, k);
		if(!Mapst[st])
			Mapst[st] = ++cntst;
	}
	cnted = cntst;
	for(int i = 1; i <= n; i++)
	{
		string st = s[i].substr(0, k), ed = s[i].substr(s[i].size() - k);
		if(!Maped[ed])
			Maped[ed] = ++cnted;
		nbr[Mapst[st]].push_back((node){Maped[ed], i});	
		nbr[Maped[ed]].push_back((node){Mapst[st], i});
	}
	for(int i = 1; i <= cntst; i++)
		if(hungary(i, ++tim))
			ans++;
	for(int i = cntst + 1; i <= cnted; i++)
		if(!mth[i] && !vis[i])
			dfs(i, 1, ++tim);
	for(int i = cntst + 1; i <= cnted; i++)
		if(mth[i] && !vis[i])
			Tsn[++as] = i;
	cout << as << endl;
	memset(vis, 0, sizeof vis);
	for(int i = 1; i <= as; i++)
		for(auto E : nbr[Tsn[i]])
		{
			if(vis[E.id])
				out[i]++;
			vis[E.id] = true;
		}
	for(int i = 1; i <= as; i++)
	{
		cout << nbr[Tsn[i]].size() - out[i] << ' ';
		for(auto E : nbr[Tsn[i]])
		{
			if(!visn[E.id])
				cout << E.id << ' ', visn[E.id] = 1;
		}
		cout << endl;
	}
	return 0;
}
2025/2/5 14:19
加载中...