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

读题

题目描述

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

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

输入格式

22行。

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

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

输出格式

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

输入输出样例

输入 #1
To
to be or not to be is a question
输出 #1
2 0

输入 #2
to
Did the Ottoman Empire lose its power at that time
输出 #2
-1

说明/提示

数据范围

11≤ 单词长度10≤10

11≤ 文章长度1,000,000≤1,000,000

noip2011普及组第2题

实现

————最简单的方法 没有 之一

核心就是for循环,比较文章的每个字符与单词的一个字母,如果一样,就用另一个for循环依次向后对比(对比过程中,把这个字母的大小写都试一下)即可。
But,这个办法在样例2中显然通过不了。有一个最偷懒的办法,就是在原单词的结尾处加上一个空格,样例2就可以通过了。
But,当你兴高采烈地提交时,发现——

评测状态 Unaccepted
评测分数 60
提交时间 *******

第5、7、8、9就会WA,在浪费一次下载机会后发现:如果样例是这样的:

to
Tom jump onto the door.

程序就通过不了,会输出有一个,实质上是没有。有一个最偷懒的办法,就是在判断的时候多判断单词首字母前是不是空格即可,自造样例(整道题)就可以通过了。

实现也不是很难,直接贴代码:

代码

禁止抄袭

#include <bits/stdc++.h>
using namespace std;
char art[1000015];
char word[15];
int n,m,sum=0,locate= 100;
bool flag;
int main(){
    cin >> word;
    getchar();
    gets(art);
    n = strlen(art);
    m = strlen(word);
    word[m]=' ';
    for(int i = 0; i < n; i++){
        if((art[i] == word[0] || art[i] == word[0]+('a'-'A') || art[i] == word[0]-('a'-'A')) && (art[i-1] == ' ' || art[i-1] == ' ' || art[i-1] == ' ')){
            flag = true;
            // cout << i << " ";
            for(int j = 0; j <= m; j++){
                if(art[i+j] != word[j] && art[i+j] != word[j]+('a'-'A') && art[i+j] != word[0+j]-('a'-'A')){
                    flag = false;
                }
            }
            if(flag){
                if(sum==0){
                    locate = i;
                }
                sum++;
                // cout << i << endl;
            }
        }
    }
    if(sum == 0){
        cout << "-1";
    }else{
        cout << sum << " " << locate;
    }
    return 0;
}