以为思路错、模板错WA了好久
原来是看错题,吸取教训了!
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 300
#define INF 20000000
int cal(char *a,char *b)
{
int lena=strlen(a);
int lenb=strlen(b);
int i=lena-1,j=0;
for(;i>=0&&j<lenb;--i,++j)
if(a[i]!=b[j])
break;
return j;
}
int n,map[N][N],lx[N],ly[N],visx[N],visy[N],matchy[N],ans,slack;
char a[250][1200];
bool dfs(int u)
{
visx[u]=1;
for(int i=1;i<=n;++i)
if(!visy[i])
{
int temp=lx[u]+ly[i]-map[u][i];
if(temp==0)
{
visy[i]=1;
if(matchy[i]==0||dfs(matchy[i]))
{
matchy[i]=u;
return true;
}
}
else if(temp<slack)
slack=temp;
}
return false;
}
void KM()
{
memset(ly,0,sizeof(ly));
memset(matchy,0,sizeof(matchy));
for(int i=1;i<=n;++i)
{
lx[i]=-INF;
for(int j=1;j<=n;++j)
if(map[i][j]>lx[i])
lx[i]=map[i][j];
}
for(int i=1;i<=n;++i)
while(1)
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
slack=INF;
if(dfs(i))
break;
for(int j=1;j<=n;++j)
if(visx[j])
lx[j]-=slack;
for(int j=1;j<=n;++j)
if(visy[j])
ly[j]+=slack;
}
ans=0;
for(int i=1;i<=n;++i)
{
ans+=map[matchy[i]][i];
}
}
int main ()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;++i)
scanf("%s",a[i]);
memset(map,0,sizeof(map));
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
map[i][j]=(i==j?0:cal(a[i],a[j]));
KM();
printf("%d\n",ans);
}
return 0;
}