您的位置:首页 > 产品设计 > UI/UE

UVa - 123 - Searching Quickly

2014-05-20 13:05 447 查看
其实上周末就看到这道题目了,可是当时一看觉得做起来比较复杂而且没有什么好的想法就暂时放下直到昨晚又翻出来做,可是!哎这过程真是一波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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: