题目
题目描述
Carryon最近喜欢上了一些奇奇怪怪的字符,字符都是英文小写字母,但奇怪的是a可能比b小,也可能比b大,好奇怪。与此同时,他拿到了好多的字符串,可是看着很不顺眼,因为他们很乱,所以他想将这些字符串按字典序从小到大排下序,这样就好看多了。由于a可能比b小,也可能比b大,这样按常规方法肯定是不行的,幸运的是他破解了26个字母的大小顺序,这样他就开开心心的将字符串从小到大排序了。
输入
第一行输入2626个字符的大小顺序
第二行输入一个n(1≤n≤105)n(1≤n≤105)。
接下来nn行,每行一个字符串sisi,数据保证每个字符串不重复。(1≤∑i=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 }