UVa - 123 - Searching Quickly

其实上周末就看到这道题目了,可是当时一看觉得做起来比较复杂而且没有什么好的想法就暂时放下直到昨晚又翻出来做,可是!哎这过程真是一波n折...

首先自己觉得对结构体的运用还不熟悉所以就没有用结构体来做。具体做法就是先分别储存word和title在两个二维数组中,然后对每一个title,依次取出它里面的每一个单词,每取出一个单词就和word中所有单词比较一次,如果不一样的话就存到key里面,要注意的是由于这样做可能把一个key多次储存了所以每次存一个新的key之前还要拿它和已经存到的key比较,不一样才存入...找出了所有key以后就排序...排序完了又在每一个title里面找key,若找到了就把它弄成大写输出,输出完了再变回小写,在这里我犯了个严重的错误,也是4次WA的主要原因,就是我每当匹配到一个key就马上把它弄大输出了,并没有考虑到它是不是单独的单词,eg:其中一个key是a ,按理说 apple 不是key,但是之前写的程序却输出了 Apple ,所以每次输出前要判断那个key两边的字符是否是字母...

好吧这道题目CE4次(又用了strlwr还有gets()它也不让过...)WA四次 TLE1次...真辛苦哎...


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
char word[55][15],title[205][1000],key[10000][20];
int len1,len2,len3;

int cmp(const void *a, const void *b)
{
    return strcmp((char *)a, (char *)b);
}

void find_key()
{
    int sign,flag,i,j,k,l,m;
    char temp[20];
    for(i=0;i<len2;i++)
    {
        if(title[i][0]==0) continue;
        for(j=k=0;;j++)
        {
            if(title[i][j]==' '||title[i][j]=='\0')
            {
                while(title[i][j]==' ') j++;
                if(title[i][j]!='\0') j--;
                temp[k]='\0';

                for(l=sign=0;l<len1;l++)
                    if(!strcmp(word[l],temp))
                    {
                        sign++;
                        break;
                    }
                if(!sign)
                {
                    for(m=flag=0;m<len3;m++)
                        if(!strcmp(temp,key[m]) )
                        {
                            flag++;
                            break;
                        }
                    if(!flag) strcpy(key[len3++],temp);
                }
                if(title[i][j]==0) break;
                k=0;
                continue;
            }
            temp[k++]=title[i][j];
        }
    }
}

void print()
{
    int i,j,k,len,flag;
    char *p;
    for(i=0;i<len3;i++)
    {
        len=strlen(key[i]);
        for(j=0;j<len2;j++)
        {
            p=title[j];
            while((p=strstr(p,key[i]))!=NULL)
            {
                flag=0;
                if(p==title[j]&&!isalpha(*(p+len))) flag++;
                else if(!isalpha(*(p-1))&&!isalpha(*(p+len))) flag++;

                if(flag)
                {
                    for(k=0;k<len;k++)
                        *(p+k)=toupper(*(p+k));
                    puts(title[j]);
                    for(k=0;k<len;k++)
                        *(p+k)=tolower(*(p+k));
                }
                p+=len;
            }
        }
    }
}

void mystrlwr(char *s)
{
    int i;
    for(i=0;s[i]!='\0';i++)
        s[i]=tolower(s[i]);
}

int main()
{
    int i;
    while(scanf("%s",word[len1])==1)
    {
        if(!strcmp(word[len1],"::")) break;
        len1++;
    }
    getchar();
    while(fgets(title[len2],sizeof(title[0]),stdin)!=NULL)
    {
        title[len2][strlen(title[len2])-1]='\0';
        len2++;
    }
    for(i=0;i<len2;i++)
        mystrlwr(title[i]);
    find_key();
    qsort(key,len3,sizeof(key[0]),cmp);
    print();
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值