noip2011普及组第2题超详细C++题解

noip2011普及组第2题题解(洛谷P1308)

题目描述

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

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

说明/提示

数据范围

1≤1≤单词长度≤10≤10。

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

代码(C++)

#include
#include
#include
using namespace std;
int main()
{
    char w[11],s[1000001];      //w为输入的单词,s为输入的文章
    int j=0,x=0;    //j用来遍历单词,x是表示状态的变量
//x为-1时,表示目前检测道德单词不是要输入的单词
//x为0时,表示遇到文章中的空格,准备开始下一个单词的检测
//x为1时,就是找到啦!
    int oc,count=0,h=0;     //oc用来储存第一个找到的位置
//count记录出现的次数,h用来确保oc只存储第一次找到的位置
    gets(w);
    gets(s);    //最适合新手的输入方式
    int a1,a2;
    a1=strlen(w);
    a2=strlen(s);   //a1,a2分别是w,s的长度,strlen是系统自带函数
//注意,strlen函数很慢,务必事先把值存储到a1,a2中
//否则后几个测试点会出现TLE错误
    for(int i=0;i<a1;i++)    //遍历单词和文章,将其统一转换为小写
        w[i]=tolower(w[i]);
    for(int i=0;i<a2;i++)     //tolower是系统自带函数
        s[i]=tolower(s[i]);  //相应变成大写的函数是toupper
    for(int i=0;i<a2;i++)   //遍历文章
    {
        j=0;   //确保每次检测单词从第一个字母开始
        if(w[j]==s[i]&&x==0)  //x=0表示为空格状态,开始新单词的检测
//若第一个字母相同则进入下述判断流程
        {
            for(;j<a1;j++)   //遍历单词
            {
                if(w[j]!=s[i+j])  //如果出现不同,x赋值为-1,退出循环
                {   
                    x=-1;
                    break;
                }
                x=-1;   //如果一直一样,但后面还有单词,x赋值为-1
                if(s[i+j+1]==' '||i+j+1==a2) //如果下一个是空格或者文章结束,则找到啦!
                    x=1;
            }
            if(x==1)  //找到了后,要简单的储存一下
            {
                count++;
                if(h==0)
                    oc=i;
                h=1;
                i=i+a1-1;  //因为遍历的是单词,i没有变化,因此给i加上单词的长度
//注意,for循环有i++,因此要事先-1!
            }
        }
        else if(s[i]==' ') //空格情况
            x=0;
        else        //其他情况则为非相同的单词
            x=-1;
    }
    if(count!=0)    //如果找到了,按要求输出
        cout << count << " " << oc;
    else         //没找到就输出-1
        cout << "-1";
    return 0;
}

写的这么辛苦,觉得有用点个赞哦~

你可能感兴趣的:(算法学习日记)