Форум программистов, компьютерный форум, киберфорум
Наши страницы

Найти ошибку в решении задачи "Шифровка" (acmp) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ С чего начать учиться программированию http://www.cyberforum.ru/cpp-beginners/thread930305.html
Подскажит пожалуйста с чего начать учиться программированию, какие советы вы можете дать?
C++ Что делает строка? Что делает 14 строка? P.S. Программа читает пары с файла и выводит их на экран. # include <iostream> # include <string> # include <vector> # include <algorithm> # include <cmath> # include... http://www.cyberforum.ru/cpp-beginners/thread930292.html
C++ Среда wxDevC++
Вопрос наверное простой, но никак не могу рзобраться. Итак по пунктам: 1) Как включить автозавершение кода? У меня он либо не работает, либо работает, но выдает список методов которых нет в моем...
getchar() в linux C++
Здравствуйте! Я создал небольшую консольную программу. Сначала мне нужно ввести данные с помощью cin и нажать Enter. Сразу после cin у меня идет команда getchar(), но она, вместо того, чтобы ждать...
C++ code::block автоформатирование текста http://www.cyberforum.ru/cpp-beginners/thread930248.html
в RAD 2010 есть такая классная штука "format source" которая приводит код в человеческий вид, есть ли такая фича для код блока?
C++ Qt Creator и автодополнение кода Решил попробовать Qt Creator в качестве IDE для С++ проектов вместе с mingw 4.8.1. Заметил, что не работает автодополнение кода для С++11 фич (типа std::array), но сам код компилируется нормально. В... подробнее

Показать сообщение отдельно
nuts23
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 30

Найти ошибку в решении задачи "Шифровка" (acmp) - C++

30.07.2013, 12:45. Просмотров 766. Ответов 1
Метки (Все метки)

Шифровка
(Время: 1 сек. Память: 16 Мб Сложность: 29%)

Разведкой был перехвачен ряд шифровок, которые передавал Джеймс Бонд. Известно, что каждое послание зашифровано методом циклического сдвига. Суть которого в том, что каждая буква заменяется на букву, отстоящую в алфавите от первой на определенном расстоянии. Это расстояние называется знаменателем шифра. Так, при знаменателе шифра 2 буква D превратится в F, буква Q – в S, а Z – в B. Известно, что Бонд использует знаменатели от 0 до 25, и составляет послания исключительно из заглавных букв английского алфавита. Знаменатели в шифровках постоянно меняются, так что расшифровать содержимое послания будет не просто. После тщательного анализа удалось примерно определить предмет посланий. Теперь для каждого послания точно известно одно из входящих туда слов.

Входные данные

В первой строке входного файла INPUT.TXT содержится строка с перехваченным посланием, а во второй строке – слово, которое обязательно присутствует в этом послании. Обе строки состоят только из заглавных английских букв и содержат не больше 40 символов.

Выходные данные

В выходной файл OUTPUT.TXT выведите расшифрованный текст, либо сообщение «IMPOSSIBLE», если разгадать шифровку невозможно. В тех случаях, когда расшифровка возможна с различными знаменателями, то следует вывести вариант с наименьшим таким значением.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    char A[41];
    char B[41];
    gets(A);
    gets(B);
    int d1;
    int d2;
    d2 = strlen(B);
    int i = 0;
    int j = 0;
    int k = 0;
    int z = 0;
    int d0;
    d0 = 10000;
    int imax = -1;
    while (A[i])
    {
        j = 0;
        k = i;
        z = 0;
        d1 = int(A[k])-int(B[j]);
        while (d1 == int(A[k++])-int(B[j++]) && A[k-1]!='\0' && B[j-1]!='\0')
        {
            ++z;
            if (z > imax) // imax - длина совпадения
            {
                imax = z;
                if (d1 < d0) // минимальный знаменатель
                    d0 = d1;
            }
            //printf("%d", int(A[k-1]));
        }
 
        ++i;
    }
    if (imax < d2)
        printf("IMPOSSIBLE");
    else
    {
        for (int i = 0; A[i]; ++i)
            printf("%c", char(int(A[i]-d0)));
    }
    return 0;
}
WA на 5 тесте. В обсуждении к задаче сказано, что ошибка в 5-ом, скорее всего, связана с тем, что программа находит не минимальный знаменатель.

Добавлено через 23 часа 24 минуты
Ап. Проблема ещё актуальна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru