简单的DP...并且在转移的时候标记转移的路径~~最后再输出最优路径就ok了...

Program:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define PI 3.1415927
using namespace std;
struct node
{
int l,dp,pre,data[26];
char s[22];
}a[10002];
bool cmp(node a,node b)
{
return a.l<b.l;
}
int i,j,k,n,ans,w[22];
char out[10002][22];
int main()
{
n=1;
memset(a,0,sizeof(a));
while (~scanf("%s",a[n].s))
{
a[n].l=strlen(a[n].s);
a[n].dp=1;
for (i=0;i<a[n].l;i++)
a[n].data[a[n].s[i]-'a']++;
n++;
}
n--;
sort(a+1,a+1+n,cmp);
memset(w,0,sizeof(w));
for (i=2;i<=n;i++)
if (a[i].l!=a[i-1].l)
w[a[i-1].l]=i-1;
ans=1;
for (i=1;i<=n;i++)
if (w[a[i].l-1])
{
for (j=w[a[i].l-1];a[j].l==a[i].l-1;j--)
{
for (k=0;k<26;k++)
if (a[i].data[k]<a[j].data[k]) goto A;
if (a[i].dp<a[j].dp+1)
{
a[i].dp=a[j].dp+1;
a[i].pre=j;
}
A: ;
}
if (a[i].dp>a[ans].dp) ans=i;
}
n=0;
i=ans; j=0;
while (i)
{
strcpy(out[++j],a[i].s);
i=a[i].pre;
n++;
}
for (i=n;i>=1;i--) puts(out[i]);
return 0;
}