Carryon的字符串 自定义快排加map匹配

题目

题目描述

Carryon最近喜欢上了一些奇奇怪怪的字符,字符都是英文小写字母,但奇怪的是a可能比b小,也可能比b大,好奇怪。与此同时,他拿到了好多的字符串,可是看着很不顺眼,因为他们很乱,所以他想将这些字符串按字典序从小到大排下序,这样就好看多了。由于a可能比b小,也可能比b大,这样按常规方法肯定是不行的,幸运的是他破解了26个字母的大小顺序,这样他就开开心心的将字符串从小到大排序了。

输入

第一行输入2626个字符的大小顺序

第二行输入一个n(1n105)n(1≤n≤105)。

接下来nn行,每行一个字符串sisi,数据保证每个字符串不重复。(1i=1nlen(si)3×105)(1≤∑i=1nlen(si)≤3×105)

输出

将n个字符串按字典序从小到大输出。

样例输入

abcdefghijklmnopqrstuvwxyz
5
bcda
licj
lin
aaaa
aaaaa

样例输出

aaaa
aaaaa
bcda
licj
lin

解题思路:将新的顺序用map存下,然后用新的字符串存下原字符串根据新的排列顺序而得到的字符串,比如原字符串为‘abcd’,新的排列顺序为‘dbac’,那么得到的字符串为‘cbda’,然后把得到的字符串根据快排得到排列顺序,并根据此排列顺序将原字符串输出就行了;
以下为ac代码:
 1 #include<iostream>
 2 #include<cstring>
 3 #include<map>
 4 #include<algorithm>
 5 using namespace std;
 6 struct str{
 7     string s,ss;
 8 };
 9 bool cmp(str s1,str s2)
10 {
11     return s1.ss<s2.ss;
12 }
13 int main()
14 {
15     map<char,char> mp;
16     int n;
17     char astr[90];
18     str strs[100005];
19     cin>>astr;
20     for(int i=0;i<26;i++)
21         mp[astr[i]]='a'+i;
22     cin>>n;
23     for(int i=0;i<n;i++)
24     {
25         cin>>strs[i].s;
26         for(int j=0;j<strs[i].s.length();j++)
27             strs[i].ss+=mp[strs[i].s[j]];
28     }
29     sort(strs,strs+n,cmp);
30     for(int i=0;i<n;i++)
31     cout<<strs[i].s<<endl;
32     return 0;
33 }
 
原文地址:https://www.cnblogs.com/wwq-19990526/p/9467510.html