ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1002. Телефонные номера

Why i got Mem Limit Exceeded, but all is ok ??? 1002 problem
Послано NooD 11 май 2003 12:29
#include <iostream.h>
#include <string.h>

const max_num_len = 100;
const max_word_len = 50;

char conv(char a) {
    if (a == 'i' || a == 'j') return '1';
    if (a == 'a' || a == 'b' || a == 'c') return '2';
    if (a == 'd' || a == 'e' || a == 'f') return '3';
    if (a == 'g' || a == 'h') return '4';
    if (a == 'k' || a == 'l') return '5';
    if (a == 'm' || a == 'n') return '6';
    if (a == 'p' || a == 'r' || a == 's') return '7';
    if (a == 't' || a == 'u' || a == 'v') return '8';
    if (a == 'w' || a == 'x' || a == 'y') return '9';
    return '0';
}

main() {
    char *num = new char [max_num_len + 1];
    char *word = new char [max_word_len + 1];
    char *res;
    char **words, **codes;
    unsigned int *d0, *d1;
    long n, i, j;
    char *ptr;
    unsigned int s0, s1;
    long stack[max_num_len][2], stackp;
    long st0, st1;
    long way[100];
    long best[100], mink = 200;
    char pr[2] = " ";

    while (1) {
        cin >> num;
        if (strcmp(num, "-1") == 0) break;
        cin >> n;
        words = (char **) new char *[n];
        codes = (char **) new char *[n];
        d0 = new unsigned int [n];
        d1 = new unsigned int [n];
        for (i = 0; i < n; i++) {
            cin >> word;
            words[i] = new char [strlen(word) + 1];
            codes[i] = new char [strlen(word) + 1];
            strcpy(words[i], word);
            // codes generating
            for (j = 0; j < strlen(word); j++)
                codes[i][j] = conv(word[j]);
            codes[i][strlen(word)] = 0;
        }
        // d0 and d1 generating
        for (j = 0; j < n; j++) {
            if (ptr = strstr(num, codes[j])) {
                s0 = ptr - num;
                s1 = ptr - num + strlen(codes[j]) - 1;
                d0[j] = s0;
                d1[j] = s1;
            }
                else {
                    d0[j] = 60000;
                    d1[j] = 60000;
                }
        }
        res = new char [max_num_len*2 + 1];
        res[0] = 0;
        // Stack generating
        stackp = 0;
        for (i = 0; i < n; i++) {
            if (d0[i] == 0) {
                stackp++;
                stack[stackp-1][0] = i;
                stack[stackp-1][1] = 0;
            }
        }
        if (stackp == 0) {
            strcpy(res, "No solution.");
        }
            else {
                while (stackp != 0) {
                    st0 = stack[stackp-1][0];
                    st1 = stack[stackp-1][1];
                    way[st1] = st0;
                    stackp--;
                    for (i = 0; i < n; i++) {
                        if (d1[st0] == strlen
(num)-1) {
                            if (st1 <
mink) {
                                mink
= st1+1;
                                for
(j = 0; j < mink; j++)

    best[j] = way[j];
                            }
                            break;
                        } else
                        if (d0[i] == d1[st0]
+1) {
                            stackp++;
                            stack[stackp-
1][0] = i;
                            stack[stackp-
1][1] = st1 + 1;
                        }
                    }
                }
            if (mink == 200) {
                strcpy(res, "No solution.");
            }
                else {
                    for (i = 0; i < mink; i++) {
                        strcat(res, words[best
[i]]);
                        strcat(res, pr);
                    }
                    res[strlen(res)-1] = 0;
                }
            }
        cout << res << "\n";

        delete [] words;
        delete [] codes;
        delete [] d0;
        delete [] d1;
    }
}