[EOJ][ECNU]Problem2896. 随机排序

26 篇文章 0 订阅

很久没有写算法题解了,一个原因是前段时间因为其他事“放弃”了算法半年,然后最近这一个星期慢慢捡起来大多数题解也都有人写了博客了所以感觉也没必要写,这次写这篇题解是一个要考研上机复试的同学问我的一个问题,然后我上网搜时似乎也没看到啥满意的C++代码,就顺手写了这篇题解报告


题目连接:https://acm.ecnu.edu.cn/problem/2896/

Time limit per test: 2.0 seconds

Memory limit: 256 megabytes

给定一组以一个空格分隔的只含大小写字母的字符串。与普通字典序不同,按照给定的字母顺序对这组字符串排序。设两个字符串的字母不会完全相同。如:Hat、hat、HAt 等不会同时出现。

例如:字母顺序为 QWERTYUIOPASDFGHJKLZXCVBNM 时,一组字符串 hat cat bat book bookworm Dallas Austin Houston fire firefox fumble 的排序结果为:Austin Dallas fumble fire firefox Houston hat cat book bookworm bat。

Input

每组数据由 2 行组成,第 1 行为字母顺序(26 个大写字母),第 2 行是需要排序的一组字符串(只含大小写字母,长度不大于 20)。

数据不多于 100 组。需要排序的一组字符串中包含的字符串个数至少 1 个,至多 100 个。

Output

对于每一组数据,输出排序后的字符串。字符串之间输出一个空格,最后一个字符串后面没有空格,而是输出一个换行符。

Examples

Input
QWERTYUIOPASDFGHJKLZXCVBNM
hat cat bat book bookworm Dallas Austin Houston fire firefox fumble
QWERTYUIOPASDFGHJKLZXCVBNM
How are you
QAZWSXEDCRFVTGBYHNUJMIKOLP
How are you
ABCDEFGHIJKLMNOPQRSTUVWXYZ
How are you
Output
Austin Dallas fumble fire firefox Houston hat cat book bookworm bat
you are How
are you How
are How you

思路也很简单,考点应该就是想考一个自定义排序函数而已,只用把给出的字母优先级用到自定义排序函数中就好了

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cctype>
using namespace std;
int score[26]={0};//储存每个字母优先级的数组 
bool cmp(const string &a,const string &b)//自定义排序函数 
{
	int len=min(a.size(),b.size());
	for(int i=0;i<len;i++)
	{
		char tmpa=toupper(a[i]),tmpb=toupper(b[i]);
		if(tmpa!=tmpb)//如果字母有不一样的,返回比较结果,达到排序效果 
		{
			return score[tmpa-'A']<score[tmpb-'A'];
		}		
	}
	return a.size()<b.size();//如果a是b的子串,则a在b前面 
}
int main()
{
	string order;
	while(cin>>order)
	{
		for(int i=0;i<26;i++)//把每个字母的优先级储存进去 
		{
			score[order[i]-'A']=i;
		}
		cin.get();
		string str;
		getline(cin,str);
		vector<string> v;
		int former=0;
		for(int i=0;i<=str.size();i++)//字符串分割 
		{
			if(i==str.size()||str[i]==' ')
			{
				string tmp(str,former,i-former);
				v.push_back(tmp);
				former=i+1;
			}
		}
		sort(v.begin(),v.end(),cmp);//排序后输出 
		cout<<v[0];
		for(int i=1;i<v.size();i++)
		{
			cout<<" "<<v[i];
		}
		cout<<"\n";
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值