code vs 买帽子

2980 买帽子

 时间限制: 2 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题解
 查看运行结果
题目描述 Description

      小A想买一顶新帽子,商店里有n个帽子 (1<=n<=100),每顶帽子上有一个字符串,字符串的长度为len (1<=len<=500)。她认为每顶帽子上的字符串看起来越对称则代表这顶帽子更漂亮。根据每个字符串,我们可以算出其对称系数k (即最长对称子序列的长度) 来比较各顶帽子在小A心中的漂亮程度。

      例如,字符串 character (k=5) 比 pollution (k=4) 更对称,apple (k=2) 比 pear (k=1) 更对称。

      现在给定n个字符串,请将它们按对称系数排序后从大小输出 (k相同时按字典序排序)。

输入描述 Input Description

输入数据第一行只有一个n,表示有个字符串。

接下来有n行,每行一个字符串。

输出描述 Output Description

输出有n行,每行一个字符串,表示按对称系数从大到小排序后的字符串,对称系数相同时按字典序排序。

样例输入 Sample Input

5

pineapple

banana

peach

coconut

character

样例输出 Sample Output

banana

character

pineapple

coconut

peach

数据范围及提示 Data Size & Hint

数据范围:

1<=n<=100

1<=len<=500

1<=k<=len

提示:

对称系数k是指最长对称子序列的长度,非最长对称子串的长度。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int i,j,k,n,m,f[503][503];
char s[102][503];
char a[1000],b[1000];
int len[102];
struct data
{
	int x,pos,str;
	char s[503];
};data ans[103];
int cmp(data a,data b)
{
   if (a.pos>b.pos)  return 1;
   else
    if (a.pos<b.pos) return 0;
   int <span style="color:#000099;">len=min(a.str,b.str);</span>  //刚开始写的是 len=min(strlen(a.s),strlen(b.s))结果不知道为什么错了,所以就记录了一下长度
      for (int i=1;i<=len;i++)
       if (a.s[i]<b.s[i])  return 1;
       else if (a.s[i]>b.s[i]) return 0;
   if (a.str<a.str)  return 1;
   else  return 0;
}
int main()
{
  scanf("%d\n",&n);
  for (i=1;i<=n;i++)
   {
   	 memset(f,0,sizeof(f));
     gets(s[i]);
     len[i]=strlen(s[i]);
     for (j=1;j<=len[i];j++)
      a[j]=s[i][j-1];
     for (j=len[i];j>=1;j--)
      b[len[i]-j+1]=s[i][j-1];
     for (int ii=1;ii<=len[i];ii++)//求字符串的最长回文串就是将字符串取反然后求两个串的最长公共子序列
      for (j=1;j<=len[i];j++)
       if (a[ii]==b[j])
        f[ii][j]=f[ii-1][j-1]+1;
       else
        f[ii][j]=max(f[ii-1][j],f[ii][j-1]);
	 ans[i].x=i; ans[i].pos=f[len[i]][len[i]];
	 for (j=1;j<=len[i];j++)
	  ans[i].s[j]=a[j];
	 ans[i].str=len[i];
   }
   sort(ans+1,ans+n+1,cmp);
   for (i=1;i<=n;i++)
    {
      int x=ans[i].x;
      for (j=0;j<=len[x]-1;j++)
       printf("%c",s[x][j]);
      printf("\n");
    }
   return 0;
}


你可能感兴趣的:(code vs 买帽子)