Cod sursa(job #714575)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 15 martie 2012 20:53:28
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.89 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define lmax 100010
#define X 26
#define nmax 700

vector <int> g[nmax];
char s[lmax];
int l, n, m, c[nmax], p[nmax], uz[nmax], d, ans, h, sol[nmax], cc[nmax], elim[nmax], pp[nmax];
short u[nmax][nmax];

int pairup (int nod)
{
	if (uz[nod]==d) return 0;
	uz[nod]=d;
	int i, v;
	for (i=0; i<g[nod].size(); i++)
	{
		v=g[nod][i];
		if (!elim[v])
		if (p[v]==-1 || pairup(p[v]))
		{
			p[v]=nod;
			c[nod]=v;
			return 1;
		}
	}
	return 0;
}

int cuplaj()
{
	int i, last, sum;
	for (i=0; i<=m; i++) p[i]=-1;
	for (i=0; i<=n; i++) c[i]=-1;
	last=-1;
	sum=d=0;
	while (last!=sum)
	{
		d++;
		last=sum;
		for (i=0; i<=n; i++)
			if (g[i].size() && c[i]==-1) sum += pairup (i);
	}
	return sum;
}


int main()
{
	freopen("cuvinte3.in","r",stdin);
	freopen("cuvinte3.out","w",stdout);
	fgets(s, lmax, stdin);
	l=strlen(s);
	l--;
	int i, pn, pm, j, w, cn, ok;
	n=m=X*X-1;
	cn=n;
	if (s[0]<='Z') 
	{
		n++;
		pn=n;
	} else
	{
		m++;
		pm=m;
	}
	if (s[l-2] <= 'Z') n++; else m++;
	if (s[0]<='Z') g[pn].push_back ((s[0]-'A')*X+s[1]-'a'); else
		g[(s[0]-'a')*X+s[1]-'A'].push_back (pm);
	if (s[l-2] <='Z') g[n].push_back ((s[l-2]-'A')*X+s[l-1]-'a'); else
		g[(s[l-2]-'a')*X+s[l-1]-'A'].push_back (m);
	
	for (i=0; s[i+2]>='A' && s[i+2]<='z'; i++) 
		if (s[i]>='a') 
		{
			//printf("%d %da\n", (s[i]-'a')*X+s[i+1]-'A', (s[i+1]-'A')*X+s[i+2]-'a');
			if (!u[(s[i]-'a')*X+s[i+1]-'A'][(s[i+1]-'A')*X+s[i+2]-'a'])
			{
				g[(s[i]-'a')*X+s[i+1]-'A'].push_back ((s[i+1]-'A')*X+s[i+2]-'a'); 
				u[(s[i]-'a')*X+s[i+1]-'A'][(s[i+1]-'A')*X+s[i+2]-'a']=1;
			} 
		} else
		{
		//	printf("%d %db\n", (s[i]-'A')*X+s[i+1]-'a', (s[i+1]-'a')*X+s[i+2]-'A');
			if (!u[(s[i]-'A')*X+s[i+1]-'a'][(s[i+1]-'a')*X+s[i+2]-'A'])
			{
				g[(s[i+1]-'a')*X+s[i+2]-'A'].push_back ((s[i]-'A')*X+s[i+1]-'a');
				u[(s[i+1]-'a')*X+s[i+2]-'A'][(s[i]-'A')*X+s[i+1]-'a']=1;
			}
		}
	/*for (i=0; i<=n+m; i++)
	{
		for (j=0; j<g[i].size(); j++) printf("%d ",g[i][j]);
		printf("\n");
	}*/
	ans = cuplaj();
	for (i=0; i<=n; i++) cc[i]=c[i];
	for (i=0; i<=m; i++) pp[i]=p[i];
	printf("%d\n",ans);
	
	h=0;
	for (i=0; i<=n; i++)
		if (g[i].size() && cc[i]!=-1)
		{
			g[i].erase(g[i].begin(), g[i].end());
			if (cuplaj() < ans)
			{
				ans--;
				sol[++h]=i;
			}
		}
	for (i=0; i<=m; i++)
		if (pp[i]!=-1)
		{
			elim[i]=1;
			if (cuplaj() < ans) 
			{
				ans--;
				sol[++h]=n+i;
			}
		}
	pn=0;
	for (i=1; i<=h; i++)
		if (sol[i]>cn && sol[i]<=n)  
		{
			sol[i]= cc[sol[i]]+n;
			if (!pn) pn=i;
		}
	sort (sol+pn, sol+h+1);
	for (i=1; i<=h; i++) 
	{
		ok=0;
		if (sol[i]>n) 
		{
			sol[i]-=n;
			ok=1; 
		} 
		for (j=0, w=0; w+X<=sol[i]; j++, w+=X);
		sol[i]-=w;
		if (!ok) 
			printf("%c%c\n",j+'a', sol[i]+'A'); else
			printf("%c%c\n",j+'A', sol[i]+'a');
	}
}