Самая длинная подстрока, которая встречается как минимум дважды: вопрос C ++

Название ужасное, я знаю, но пока я не знаю ответ на свой вопрос, я не могу придумать лучшего. Если можете, отредактируйте.

Я решал (для удовольствия) очень простую задачу на одном из сайтов 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. Режим выпуска. Любые идеи? Спасибо.

7
задан genesis 22 September 2011 в 15:39
поделиться