题目大意:
输入一系列要被忽视的单词和题目,题目中除了要被忽视的单词外其他的都是关键字。把关键字忽略大小写按字典序排序。再把题目按照关键字的字典序输出。有几个关键字输出几次(看题目中样例)。输出的时候那个关键字大写,其他都小写。
解题思路:
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();
}