uva - 123 - Searching Quickly

题目大意:

输入一系列要被忽视的单词和题目,题目中除了要被忽视的单词外其他的都是关键字。把关键字忽略大小写按字典序排序。再把题目按照关键字的字典序输出。有几个关键字输出几次(看题目中样例)。输出的时候那个关键字大写,其他都小写。


解题思路:

1、输入转换大小写提取关键字。
2、关键字排序。
3、在题目中搜索关键字。
4、按照关键字大写,其他小写输出。


反思:

1、刚开始因为看了篇博客导致先入为主,一直认识WA是gets的原因,然后一直修改gets和扩大数组。其实原因是Search_2()的p写成了m(居然还可以通过那么多数据)。给了之后用fgets交了下AC了,然后不死心又用gets交了下同样AC。感觉在uva上两者功能应该没区别。
2、uva上数组不能起名ignore,关键字重复吧,但是程序可以跑起来。

找出错误的样例:

a
::
I am a Man
I am a mAn
I am a maN

i AM a ma
i AM a ma
i AM a ma
I am a ma
I am a ma
I am a ma
i am a MA
i am a MA
i am a MA



AC代码:

#define Local
#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>

using namespace std;

#define MAX 10000 + 10
char ign[50][20], title[MAX][MAX], keyword[MAX][MAX];
int m, n, p; //m记录忽略单词的个数,n记录标题的个数,p是关键字数

void Input()
{
	char s[MAX];
	while (fgets(s, MAX, stdin) != NULL)
	{
		s[strlen(s)-1] = '\0';
		if (':' == s[0])
			break;
		strcpy(ign[m++], s);
	}
	while (fgets(s, MAX, stdin) != NULL)
	{
		s[strlen(s)-1] = '\0';
		strcpy(title[n++], s);
	}
}

void Strlwr()
{
	int i = 0, j = 0;
	for (i = 0; i < n; i++)
		for (j = 0; j < strlen(title[i]); j++)
			if (title[i][j] >= 'A' && title[i][j] <= 'Z')
				title[i][j]  += 'a' - 'A';
}

int Search_1(char s[])
{
	int i = 0;
	for (i = 0; i < m; i++)//存在
	{
		if (!strcmp(s, ign[i]))
			return 0;
	}
	return 1;
}

int Search_2(char s[])
{
	int i = 0;
	for (i = 0; i < p; i++)//好奇怪这一直写成m居然还能通过那么多样例。//存在
	{
		if (!strcmp(keyword[i], s))
			return 0;
	}
	return 1;
}

void ExtractAndSearch(char s[], int num)
{
	int i = 0, j = 0;
	char temp[20];
	for (i = 0; i < strlen(s); i++)
	{
		j = 0;
		memset(temp, '\0', sizeof(temp));
		while (' ' != s[i] && i < strlen(s))
		{
			temp[j++] = s[i++];
		}
		temp[j] = '\0';
		if (Search_1(temp) && Search_2(temp))//不存在的话
		{
			strcpy(keyword[p], temp);
			p++;
		}
	}
}

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

void Output()
{
	int i = 0, j = 0, k = 0, l = 0;
	for (i = 0; i < p; i++)//关键字的个数 
	{
		for (j = 0; j < n; j++)//标题的数【j写成i】又是致命错误
		{
			char temp[20];
			int pos_1 = 0, pos_2 = 0;
			for (k = 0; k < strlen(title[j]); k++)
			{
				l = 0;
				memset(temp, '\0', sizeof(temp));
				pos_1 = k;
				while (' ' != title[j][k] && k < strlen(title[j]))
				{
					temp[l++] = title[j][k++];
				}
				temp[l] = '\0';
				pos_2 = k;
				if (!strcmp(keyword[i], temp))
				{
					for (l = pos_1; l < pos_2; l++)
						title[j][l] -= 'a' - 'A';
					puts(title[j]);
					for (l = pos_1; l < pos_2; l++)
						title[j][l] += 'a' - 'A';
				}
			}
		}
	}
}

int main()
{
#ifdef Local
	freopen("a.in", "r", stdin);
	freopen("a.out", "w", stdout);
#endif
	int i = 0, j = 0;
	Input();
	Strlwr();
	for (i = 0; i < n; i++)//提取单词 并查找插入
	{
		ExtractAndSearch(title[i], i);
	}
	qsort(keyword, p, sizeof(keyword[0]), cmp);
	Output();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值