NOIP201102统计单词数

 

试题描述
   一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
输入
第1行为一个字符串,其中只含字母,表示给定单词;第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出
如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数-1。
输入示例
例1:
To
to be or not to be is a question
例2:
to
Did the Ottoman Empire lose its power at that time
输出示例
例1:2 0
例2:-1
其他说明
【数据范围】1≤单词长度≤10, 1≤文章长度≤1,000,000。 
 

这道题不难,但是需要很严谨的思考,不然很容易错。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     char word[12],essay[1010101];
 8     int len1,len2,i,j,first=-1,ans=0;
 9     bool flag=true;
10     cin.getline(word,12);
11     len1=strlen(word);
12     for(i=0;i<len1;i++)//全部变成小写字母 
13         if(word[i]<'a') word[i]+=32;
14     cin.getline(essay,1000001);
15     len2=strlen(essay);
16     for(i=0;i<len2;i++) 
17     {
18         while(essay[i]==' ' && i<len2) i++;    //找首字母位置
19         for(j=0;j<len1 && i+j<len2;j++)
20             if(word[j]!=essay[i+j] && word[j]!=essay[i+j]+32) break;   //发现不匹配,退出 
21         i=i+j;  //跳过这个单词,准备判断下一个 
22         int temp=i;
23         while(essay[i]!=' ' && i<len2) i++;  //比较结束位置 
24         if(temp==i && flag && j==len1) {flag=false;first=i-len1;}  //记录第一个单词的位置 
25         if(temp==i && j==len1) ans++;  //如果比较结束位置后面就是空格,则找到单词 
26     }
27     if(first<0) cout<<-1;  
28     else   cout<<ans<<" "<<first;
29     //system("pause");
30     return 0;
31 }
NOIP201102统计单词数

 

posted @ 2016-07-18 08:12  姚呵呵  阅读(481)  评论(0)    收藏  举报