比赛中切掉的... 代码很冗余,没怎么仔细想总之,是一个最长升序子序列的题啦。
#include<iostream>
#include<string.h>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
char line[25];
int len;
int count[27];
}date[11111];
bool cmp( node a,node b )
{
if( a.len==b.len )
{
if( strcmp(a.line,b.line)==0 )
return true;
return false;
}
return a.len<b.len;
}
int main()
{
//freopen( "text.in","r",stdin );
//freopen( "text.out","w",stdout );
int count=0;
int pre[11111];
int dp[11111];
memset( date,0,sizeof(date) );
memset( pre,0xFF,sizeof(pre) );
memset( dp,0,sizeof(dp) );
while( scanf( "%s",date[count].line)!=EOF )
{
date[count].len=strlen( date[count].line );
for( int i=0;i<date[count].len;i++ )
date[count].count[date[count].line[i]-'a']++;
dp[count]=1;
count++;
}
sort( date,date+count,cmp );
for( int i=1;i<count;i++ )
{
for( int j=i-1;j>=0;j-- )
{
if( date[i].len==date[j].len+1 )
{
int cnt=0;
for( int k=0;k<26&&cnt<=1;k++ )
if( date[i].count[k]!=date[j].count[k] )
cnt++;
if( cnt==1 )
{
if( dp[i]<dp[j]+1 )
{
dp[i]=dp[j]+1;
pre[i]=j;
}
}
}
if( date[j].len<date[i].len-1 )
break;
}
}
int dp_max=0;
int index=0;
for( int i=0;i<count;i++ )
if( dp[i]>dp_max )
dp_max=dp[i],index=i;
node ans[11111];
int len=0;
for( int i=index;;i=pre[i] )
{
ans[len]=date[i];
len++;
if( pre[i]==-1 )
break;
}
for( int i=len-1;i>=0;i-- )
printf( "%s\n",ans[i].line );
return 0;
}