Не проходит 10 тест на acmp (задача 65) [закрыт]

150
30 декабря 2019, 07:40
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Update the question so it's on-topic for Stack Overflow на русском.

Закрыт 9 месяцев назад.

#include <fstream>
#include <string>
using namespace std;
int main()
{
    string s; // принятое сообщение
    string n; // количество следующих сообщений
    string m; // следующие сообщения
    int min; // мин. кол-во отличных позиций
    int k; // кол-во сообщений, которые отличаются от s мин. кол-вом позиций
    string index; // их номера
    ifstream fin;
    fin.open("INPUT.TXT");
    getline(fin, s); // считываем принятое сообщение
    getline(fin, n); // считываем n
    min = s.length(); // min присваиваем длину строки
    for (int i = 1; fin.peek() != EOF; i++)
    {
        getline(fin, m); // считываем сообщение
        int diff = 0; // количество отличий = 0
        for (int j = 0; j < s.length(); j++)
        {
            if (s[j] != m[j]) // если отличаются
                diff++; // то увеличиваем счетчик
            if (diff > min) break;  
        }
        if (diff < min) // если эта строка отличается на меньшее кол-во позиций
        {
            min = diff; // min присваиваем это кол-во отличных позиций
            k = 1; // k присваиваем 1
            index = "";
            index = to_string(i); // вносим номер в массив
        }
        else if (diff == min) // если нашлось такое же кол-во позиций
        {
            k++; // увеличиваем k
            index = index + " " + to_string(i); // вносим номер в массив
        }
        m = "";
    }
    fin.close();
    ofstream fout;
    fout.open("OUTPUT.TXT");
    fout << k << endl << index; // выводим результат
    fout.close();
    return 0;
}

Задача: https://acmp.ru/index.asp?main=task&id_task=65&ins=1#solution

Answer 1

Если вы нажмете ссылку "обсуждение" на странице задачи, то увидите в первом же комментарии, что возможен набор входных данных с n = 0 и таковой якобы даже присутствует среди тестов. Условие задачи действительно не гарантирует положительности n. Ваша программа, очевидно, будет выводить "мусор" для такого случая, ибо вы не инициализируете значение k (http://coliru.stacked-crooked.com/a/bcdb82b515a1f084)

Аналогичная проблема вылезет если все сообщения m будут отличаться от сообщения s во всех позициях. Так как вы изначально делаете min = s.length(), ветка if (diff < min) не выполнится никогда, и переменной k никогда не будет присвоено осмысленное значение (http://coliru.stacked-crooked.com/a/07ace0077df19ec9)

Другие косяки/странности в вашем коде есть, но в лабораторных условиях они мешать не должны.

Answer 2

Лень копаться в вашей программе на ночь глядя. Держите готовое решение...

#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;
size_t diff(const string& a, const string& b, size_t l)
{
    size_t d = 0;
    for(size_t i = 0; i < l; ++i)
        d += (a[i] != b[i]);
    return d;
}
int main()
{
    string s;
    size_t n, l, m;
    cin >> s >> n;
    l = m = s.length();
    vector<int> v;
    for(int i = 0; i < n; ++i)
    {
        string t;
        cin >> t;
        size_t d = diff(s,t,l);
        if (d > m) continue;
        if (d < m)
        {
            m = d;
            v.clear();
        }
        v.push_back(i+1);
    }
    cout << v.size() << endl;
    for(int i: v) cout << i << endl;
}
READ ALSO
Задать цвет текста кнопки программно

Задать цвет текста кнопки программно

Написал калькулятор, в котором для обработки нажатий используется интерфейс OnClickListenerВнешний вид калькулятора прописал в xml файле, а в файле...

131
Как сделать &ldquo;Рестарт&rdquo; для кнопок разом?

Как сделать “Рестарт” для кнопок разом?

Разрабатываю игру в качестве обученияВся игра идет через кнопки

155
Кастомный адаптер для спиннера

Кастомный адаптер для спиннера

Сделал кастомный адаптер для спиннераПри раскрытии спиннера метод getDropDownView вызывается непрерывно циклически, даже если список не трогать

111
Парсинг данных с помощью firebase

Парсинг данных с помощью firebase

Делаю приложение для конференций, хочу реализовать в ней новости и программу событийСайта нет, и писать его с нуля не хочется

164