Pagini recente » Cod sursa (job #1856481) | Cod sursa (job #755348) | Cod sursa (job #1785071) | Cod sursa (job #1315129) | Cod sursa (job #714575)
Cod sursa(job #714575)
#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');
}
}