【codevs2980】买帽子

来源:互联网 发布:淘宝童装小模特 编辑:程序博客网 时间:2024/05/17 03:52

题目描述 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<algorithm>#include<iostream>#include<cstring>#include<cstdio>using namespace std;int n,len;int f[505][505];char s[105][505],a[505],b[505];struct hp{int val,num,str;}temp[505];inline int cmp(hp p,hp q){if (p.val>q.val) return 1;else if (p.val<q.val) return 0;//!int len=min(p.str,q.str);for (int i=0;i<len;++i)  if (s[p.num][i]<s[q.num][i]) return 1;  else if (s[p.num][i]>s[q.num][i]) return 0;//!if (p.str<q.str) return 1;else return 0;}int main(){scanf("%d\n",&n);for (int i=1;i<=n;++i){gets(s[i]);len=strlen(s[i]);for (int j=1;j<=len;++j)  a[j]=s[i][j-1];for (int j=1;j<=len;++j)  b[j]=a[len-j+1];memset(f,0,sizeof(f));for (int x=1;x<=len;++x)  for (int y=1;y<=len;++y)    if (a[x]==b[y])      f[x][y]=f[x-1][y-1]+1;    else f[x][y]=max(f[x-1][y],f[x][y-1]);temp[i].val=f[len][len];temp[i].num=i;temp[i].str=len;}sort(temp+1,temp+n+1,cmp);for (int i=1;i<=n;++i){for (int j=0;j<temp[i].str;++j)  putchar(s[temp[i].num][j]);putchar('\n');}}


0 0
原创粉丝点击