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

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

My program(for 1002) can pass all test data from CEOI99 but it doesn't work here ?
Послано linda 10 дек 2001 00:24

/* Phone Number
 * from http://acm.timus.ru/problem.asp?id=1002
 * written by Skywind Lin
 *
 *    1 ij    2 abc    3 def
 *    4 gh    5 kl    6 mn
 *    7 prs    8 tuv    9 wxy
 *    0 oqz
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char letter[26]={ 2,2,2, 3,3,3, 4,4, 1,1, 5,5, 6,6, 0,7,0,7,7,8,
8,8,9,9,9,0 };

#ifndef ONLINE_JUDGE
#define DEBUG_TEST
#define MAX 10000
#else
#define MAX 50000
#endif

char num[101],len;
int dcount;
typedef struct NODE
{
    short index;
    char len;
    unsigned int dynamic;
    struct NODE *dynamic_link;
    struct NODE *next;
} word;
word *words[100];
int result[100];

#define HASH_LEN 256
#define HASH(x) (x&(HASH_LEN-1))
typedef struct NODES
{
    char *word;
    unsigned short index;
    struct NODES *next;
} strings;
strings *htable[HASH_LEN];

FILE *fin;

int load(void)
{
    int h,i,j,k,f,slen;
    char line[200];
    char temp[51];
    long offset;
    word *nw;
    strings *ns,*sb,*sp;
    #ifdef DEBUG_TEST
    fscanf(fin,"%s",line);
    #else
    scanf("%s",line);
    #endif
    slen=strlen(line);
    if (len>100)
    {
        printf("Number len error\n");
        return -1;
    }
    result[0]=-1;
    dcount=0;
    len=0;
    for (i=0;i<100;i++) words[i]=NULL;
    for (i=0;i<HASH_LEN;i++) htable[i]=NULL;
    if (line[0]=='-'&&line[1]=='1') return 0;
    for (i=0,len=slen,num[len]=255;i<len;i++) num[i]=line[i]-
'0';
    #ifdef DEBUG_TEST
    fscanf(fin,"%d",&dcount);
    #else
    scanf("%d",&dcount);
    #endif
    for (j=0;j<dcount;j++)
    {
        #ifdef DEBUG_TEST
        fscanf(fin,"%s",temp);
        #else
        scanf("%s",temp);
        #endif
        slen=strlen(temp);
        for (i=0;i<slen;i++)
            k=temp[i],k=(k>='A'&&k<='Z')?(k-'A'):(k-
'a'),line[i]=letter[k];
        if (slen<=len)
        {
            for (k=0;k<=len-slen;k++)
            {
                for (i=0;num[k+i]==line[i];i++);
                if (i>=slen) /* find match */
                {
                    nw=(word*)malloc(sizeof
(word)); /* insert word data */
                    if (!nw) return -3;
                    nw->index=j;
                    nw->len=slen;
                    nw->dynamic=MAX;
                    nw->dynamic_link=NULL;
                    nw->next=words[k];
                    words[k]=nw;
                    h=HASH(j);
                    for (sb=sp=htable
[h];sp;sb=sp,sp=sp->next) if (sp->index>=j) break;
                    f=0; if (sp) if (j<sp-
>index) f=1;
                    if (!sp) f=1;
                    if (f)
                    {
                        ns=(strings*)
malloc(sizeof(strings));
                        if (!nw)
return -4;
                        ns->word=
(char*)malloc(slen+1);
                        if (!ns->word)
{ free(ns); return -5; }
                        strcpy(ns-
>word,temp);
                        ns->index=j;
                        ns->next=sp;
                        if (sb) sb-
>next=ns;
                        else htable[h]
=ns;
                    }
                }
            }
        }
    }
    return 1;
}

void dsearch(void)
{
    int i,j;
    unsigned int k;
    word *p,*t;
    for (i=len-1;i>=0;i--)
        for (p=words[i];p;p=p->next)
        {
            p->dynamic_link=NULL;
            if (i+p->len==len) p->dynamic=1; /* last
word */
            else {
                for (k=MAX,t=words[i+p-
>len];t;t=t->next)
                    if (t->dynamic<k) k=t-
>dynamic, p->dynamic_link=t;
                p->dynamic=k+1;
            }
        }
    for (p=t=words[0],k=MAX;p;p=p->next)
        if (p->dynamic<k) k=p->dynamic,t=p;
    if (t==NULL||k>=MAX) result[0]=-1;
    else {
        for (i=0;t&&i<len;t=t->dynamic_link,i++) result[i]
=t->index;
        result[i]=-1;
    }
}

char *rtable(unsigned int index)
{
    int hash=HASH(index);
    strings *p;
    for (p=htable[hash];p;p=p->next) if (index<=p->index) break;
    if (!p) return NULL;
    if (p->index>index) return NULL;
    return p->word;
}

int main(void)
{
    int ok,i,j,index;
It always get the wrong answer
Послано linda 10 дек 2001 00:26