P1308 [NOIP2011 普及组] 统计单词数----有意思

# [NOIP2011 普及组] 统计单词数

## 题目描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。

## 输入格式

共 $2$ 行。

第 $1$ 行为一个字符串,其中只含字母,表示给定单词;

第 $2$ 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

## 输出格式

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 $0$ 开始);如果单词在文章中没有出现,则直接输出一个整数 $-1$。

注意:空格占一个字母位

## 样例 #1

### 样例输入 #1

```
To
to be or not to be is a question
```

### 样例输出 #1

```
2 0
```

## 样例 #2

### 样例输入 #2

```
to
Did the Ottoman Empire lose its power at that time
```

### 样例输出 #2

```
-1
```

## 提示

数据范围

$1\leq $ 第一行单词长度 $\leq10$。

$1\leq $ 文章长度 $\leq10^6$。

noip2011 普及组第 2 题

读完题目后,其实思路很简单,但是这里·可能会有一个坑等待大家-----怎么输入带空格的字符串呢?你要是直接用scanf("%s",arr)来进行输入的话,就会发现,一旦出现空格,那么输入会直接停止,所以,我们要用另一个更简单的输入函数gets(arr),这个函数就可以输入带空格的字符串,它的头文件是这就是第一步。

输入字符串,我们搞定之后接着就想要来进行判断了,这是我们就要用专门判断字符串相等的一个函数strcmp,如果两个字符串相等的话,那么该函数返回0.这样的话,我们也就完成了第二步。

但是,我们要明白,它给的字母有可能存在大写和小写的情况,但是strcmp无法判断大小写,所以我们需要转化,这时,我们在用一对函数tolower(大写转小写)和toupper(将小写转大写),任用一个·就可以了,起头文件是ctype.

接下来上代码

#include
#include
#include
#include
void zh(char arr[], int n) {
	for (int i = 0;i < n;i++) {
		arr[i] = tolower(arr[i]);
	}
}
int main() {
	char arr[20], brr[1000000] = " ";
	int n, crr[100], x = 0, y, i = 0, z = 0;
	gets(arr);
	n = strlen(arr);
	zh(arr, n);
	gets(brr);
	n = strlen(brr);
	while (x < n) {
		char drr[1000] = { 0 };
		y = 0;
		while (brr[x] == ' ') {
			x++;
		}
		while (brr[x] != ' ') {
			drr[y] = brr[x];
			x++;
			y++;
			if (x >= n) {
				break;
			}
		}
		zh(drr, y);
		if (strcmp(arr, drr) == 0) {
			crr[z] = x - strlen(arr);
			z++;
		}
	}
	if (z == 0) {
		printf("-1");
	}
	else printf("%d %d", z, crr[0]);

	return 0;
}

你可能感兴趣的:(算法)