Название ужасное, я знаю, но пока я не знаю ответ на свой вопрос, я не могу придумать лучшего. Если можете, отредактируйте.
Я решал (для удовольствия) очень простую задачу на одном из сайтов OnlineJudge. Проблема заключается в следующем:
Ввод: единственная строка, содержащая строчные латинские буквы. Длина строка должна быть не менее 1 и не более 100.
Вывод: единственное число, которое является длина самой длинной подстроки в строка ввода, которая встречается как минимум дважды в этой строке (вхождения могут перекрываться).
Пример ввода: ababa
Пример вывода: 3
Я получил Accepted со следующим кодом:
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string s;
std::cin >> s;
int max = 0;
typedef std::string::const_iterator sit;
sit end = s.end();
for(sit it1 = s.begin(); it1 != end; ++it1)
for(sit it2 = it1 + 1; it2 != end; ++it2)
max = std::max(max, std::mismatch(it1, it1 + (end - it2), it2).first - it1);
std::cout << max;
}
Однако я получаю Ошибка выполнения теста 42 (я не могу знать, что это за ввод - правила сайта) со следующим кодом, который немного отличается от первого.
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
string s;
cin >> s;
vector<size_t> dif;
for(string::const_iterator it1 = s.begin(); it1 != s.end(); ++it1)
for(string::const_iterator it2 = it1 + 1; it2 != s.end(); ++it2)
dif.push_back(mismatch(it1, it1 + (s.end() - it2), it2).first - it1);
cout << *max_element(dif.begin(), dif.end());
}
После половины час ритуальных танцев, я сдаюсь. Я не могу понять, что не так со вторым кодом (кроме того, что он немного менее эффективен и менее читабелен). Это то, что я вычитаю const_iterator
из итератора
? Или из-за int vs. size_t? Код скомпилирован (на их сайте) с помощью MSVC8.0 или 9.0. Режим выпуска. Любые идеи? Спасибо.