#include "stdio.h"
#include <iostream>
#include <string>
#include <chrono>
#include <vector>
#include <map>
#include <algorithm>
#include <set>
using namespace std::chrono;
using namespace std;
const vector<string> vecorder({ "srb","jgp","wbz","dhk","ofy","vrw","ybw","sdj","tlf","vut"});
bool veccomp(const string &s1, const string &s2) {
int a = find(vecorder.begin(), vecorder.end(), s1) - vecorder.begin();
int b = find(vecorder.begin(), vecorder.end(), s2) - vecorder.begin();
return a < b;
};
vector<string> KeySort(set<string> s, const vector<string>& order){
vector<string> res;
for(const auto& it : order){
auto needle = s.find(it);
if(needle != s.end()){
res.emplace_back(move(*needle));
s.erase(needle);
}
}
for(auto&& it : s) {
res.emplace_back(move(it));
}
return res;
}
map<const string, const int> maporder({ {"srb",1}, {"jgp",2}, {"wbz",3}, {"dhk",4}, {"ofy",5}, {"vrw",6}, {"ybw",7}, {"sdj",8}, {"tlf",9}, {"vut",10}});
bool mapcomp(const string &s1, const string &s2) {
int a = maporder[s1];
int b = maporder[s2];
//maporder.erase(s1);
return a < b;
};
vector<string> vp ={ "srb","jgp","wbz","dhk","ofy","vrw","ybw","sdj","tlf","vut"};
set<string> keyset ={ "srb","jgp","wbz","dhk","ofy","vrw","ybw","sdj","tlf","vut"};
void sortWithVector() {
random_shuffle ( vp.begin(), vp.end() );
sort(vp.begin(), vp.end(), veccomp);
}
void sortWithMap() {
random_shuffle ( vp.begin(), vp.end() );
sort(vp.begin(), vp.end(), mapcomp);
}
int main()
{
high_resolution_clock::time_point t1;
high_resolution_clock::time_point t2;
double duration;
/*--------------------------------------*/
t1 = high_resolution_clock::now();
for (int i=0; i < 10000; ++i) sortWithMap();
t2 = high_resolution_clock::now();
duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
cout<< "map: " <<duration/1000.0 << "ms" << endl;
/*--------------------------------------*/
t1 = high_resolution_clock::now();
for (int i=0; i < 10000; ++i) {random_shuffle ( vp.begin(), vp.end() ); KeySort(keyset, vecorder);}
t2 = high_resolution_clock::now();
duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
cout<< "AtnNn: " <<duration/1000.0 << "ms" << endl;
/*--------------------------------------*/
t1 = high_resolution_clock::now();
for (int i=0; i < 10000; ++i) sortWithVector();
t2 = high_resolution_clock::now();
duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
cout << "vector: " << duration/1000.0 << "ms" << endl;
return 0;
}
I2luY2x1ZGUgInN0ZGlvLmgiCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHNldD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpjb25zdCB2ZWN0b3I8c3RyaW5nPiB2ZWNvcmRlcih7ICJzcmIiLCJqZ3AiLCJ3YnoiLCJkaGsiLCJvZnkiLCJ2cnciLCJ5YnciLCJzZGoiLCJ0bGYiLCJ2dXQifSk7CmJvb2wgdmVjY29tcChjb25zdCBzdHJpbmcgJnMxLCBjb25zdCBzdHJpbmcgJnMyKSB7CglpbnQgYSA9IGZpbmQodmVjb3JkZXIuYmVnaW4oKSwgdmVjb3JkZXIuZW5kKCksIHMxKSAtIHZlY29yZGVyLmJlZ2luKCk7CglpbnQgYiA9IGZpbmQodmVjb3JkZXIuYmVnaW4oKSwgdmVjb3JkZXIuZW5kKCksIHMyKSAtIHZlY29yZGVyLmJlZ2luKCk7CglyZXR1cm4gYSA8IGI7Cn07Cgp2ZWN0b3I8c3RyaW5nPiBLZXlTb3J0KHNldDxzdHJpbmc+IHMsIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBvcmRlcil7CiAgICB2ZWN0b3I8c3RyaW5nPiByZXM7CiAgICBmb3IoY29uc3QgYXV0byYgaXQgOiBvcmRlcil7CiAgICAgICAgYXV0byBuZWVkbGUgPSBzLmZpbmQoaXQpOwogICAgICAgIGlmKG5lZWRsZSAhPSBzLmVuZCgpKXsKICAgICAgICAgICAgcmVzLmVtcGxhY2VfYmFjayhtb3ZlKCpuZWVkbGUpKTsKICAgICAgICAgICAgcy5lcmFzZShuZWVkbGUpOwogICAgICAgIH0KICAgIH0KICAgIGZvcihhdXRvJiYgaXQgOiBzKSB7CiAgICAgICAgcmVzLmVtcGxhY2VfYmFjayhtb3ZlKGl0KSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgoKbWFwPGNvbnN0IHN0cmluZywgY29uc3QgaW50PiBtYXBvcmRlcih7IHsic3JiIiwxfSwgeyJqZ3AiLDJ9LCB7IndieiIsM30sIHsiZGhrIiw0fSwgeyJvZnkiLDV9LCB7InZydyIsNn0sIHsieWJ3Iiw3fSwgeyJzZGoiLDh9LCB7InRsZiIsOX0sIHsidnV0IiwxMH19KTsKYm9vbCBtYXBjb21wKGNvbnN0IHN0cmluZyAmczEsIGNvbnN0IHN0cmluZyAmczIpIHsKCWludCBhID0gbWFwb3JkZXJbczFdOwoJaW50IGIgPSBtYXBvcmRlcltzMl07CgkvL21hcG9yZGVyLmVyYXNlKHMxKTsKCXJldHVybiBhIDwgYjsKfTsKCnZlY3RvcjxzdHJpbmc+IHZwID17ICJzcmIiLCJqZ3AiLCJ3YnoiLCJkaGsiLCJvZnkiLCJ2cnciLCJ5YnciLCJzZGoiLCJ0bGYiLCJ2dXQifTsKc2V0PHN0cmluZz4ga2V5c2V0ID17ICJzcmIiLCJqZ3AiLCJ3YnoiLCJkaGsiLCJvZnkiLCJ2cnciLCJ5YnciLCJzZGoiLCJ0bGYiLCJ2dXQifTsKCnZvaWQgc29ydFdpdGhWZWN0b3IoKSB7CglyYW5kb21fc2h1ZmZsZSAoIHZwLmJlZ2luKCksIHZwLmVuZCgpICk7Cglzb3J0KHZwLmJlZ2luKCksIHZwLmVuZCgpLCB2ZWNjb21wKTsKfQoKdm9pZCBzb3J0V2l0aE1hcCgpIHsKCXJhbmRvbV9zaHVmZmxlICggdnAuYmVnaW4oKSwgdnAuZW5kKCkgKTsKCXNvcnQodnAuYmVnaW4oKSwgdnAuZW5kKCksIG1hcGNvbXApOwp9CgoKaW50IG1haW4oKQp7CgloaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDE7CgloaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDI7Cglkb3VibGUgZHVyYXRpb247CgkKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgCiAgICB0MSA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CgkKCWZvciAoaW50IGk9MDsgaSA8IDEwMDAwOyArK2kpIHNvcnRXaXRoTWFwKCk7CgkKCXQyID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGR1cmF0aW9uID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oIHQyIC0gdDEgKS5jb3VudCgpOwogICAgY291dDw8ICJtYXA6ICIgPDxkdXJhdGlvbi8xMDAwLjAgIDw8ICJtcyIgPDwgZW5kbDsKCQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAKICAgIHQxID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCQoJZm9yIChpbnQgaT0wOyBpIDwgMTAwMDA7ICsraSkge3JhbmRvbV9zaHVmZmxlICggdnAuYmVnaW4oKSwgdnAuZW5kKCkgKTsgS2V5U29ydChrZXlzZXQsIHZlY29yZGVyKTt9CgkKCXQyID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGR1cmF0aW9uID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oIHQyIC0gdDEgKS5jb3VudCgpOwogICAgY291dDw8ICJBdG5ObjogIiA8PGR1cmF0aW9uLzEwMDAuMCAgPDwgIm1zIiA8PCBlbmRsOwoJCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCQoJdDEgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwoJCglmb3IgKGludCBpPTA7IGkgPCAxMDAwMDsgKytpKSBzb3J0V2l0aFZlY3RvcigpOwoJCgl0MiA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CglkdXJhdGlvbiA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KCB0MiAtIHQxICkuY291bnQoKTsKCWNvdXQgPDwgInZlY3RvcjogIiA8PCBkdXJhdGlvbi8xMDAwLjAgIDw8ICJtcyIgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==