Я пытаюсь практиковать С++, решая некоторые старые задачи Google Code Jam. Относительно простой способ, который я нашел, — перевернуть слова в строке. Его можно найти здесь https://code.google.com/codejam/contest/351101/dashboard#s=p1
Пока у меня есть:
#include<iostream>
using namespace std;
int main(){
int n = 0;
cin >> n;
string rev = "";
string buf = "";
string data = "";
getline(cin, data);
for(int _ = 0; _ < n; _++){
getline(cin, data);
rev = "";
buf = "";
for(char& c : data) {
buf += c;
if(c == ' '){
rev = buf + rev;
buf = "";
}
}
cout << "Case #" << _ + 1 << ": " << buf << " " << rev << endl;
}
return 0;
}
Который, кажется, работает довольно быстро. При запуске time ./reverse < in > /dev/null
с тестовым файлом, содержащим около 1.2E6
случаев, это занимает около 3.5
секунд при компиляции с g++ -O3
.
Итак, в качестве эталона я создал решение на питоне.
#!/usr/bin/env python
from sys import stdin, stdout
stdout.writelines(map(lambda n: "Case #%d: %s\n" % (n + 1, ' '.join(stdin.readline().split()[::-1])), xrange(int(stdin.readline()))))
Однако, когда я запускаю его под pypy
с time pypy reverse.py < in > /dev/null
, это занимает всего около 1.95
секунд.
Теоретически, поскольку pypy
написан на С++, не должен ли С++ быть таким же быстрым или быстрее, и если да, то как этот код можно оптимизировать, чтобы он был быстрее?
pypy
написан на C++ - Скажите, что? Это не так. Есть несколько кусков C, но в остальном он написан на RPython. - person   schedule 03.07.2013