题目:[NOIP2011]统计单词数

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

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

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

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

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

To
to be or not to be is a question

输出

2 0

输入

to
Did the Ottoman Empire lose its power at that time

输出

-1

提示
数据范围

1≤ 单词长度 ≤10。

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

提示:你可以构造单词,给单词的左右两边加上空格。

样例解释1

输出结果表示给定的单词 To 在文章中出现两次,第一次出现的位置为 0 。

样例解释2

表示给定的单词 to 在文章中没有出现,输出整数 −1。
分析与解答:
思路1. 这道题的实质是字符串的查找,同字符数组的查找想法相同。字符数组的查找想法如下:遍历字符数组a,枚举字符数组a中的每一个位置作为起点。接下来我们只要判断,以 a[i]作为起点,长度为 2 的字符串是否和"hi" 相同。下面是字符数组的查找的实现。

对于 hihellohi 这个字符数组,我们使用如下的枚举方式去匹配
hihellohi
hihihellohihihihellohihihihellohihihihellohihi......
#include <iostream>
#include <cstring>
using namespace std;int main() {char s[] = {"hi"};char a[1000];int ans = 0;cin >> a;int len = strlen(a);for(int i=0; i<len-1; i++){bool flag = true;for(int j=0; j<2; j++){if(a[i+j] != s[j]){flag = false;break;}       }   if(flag == true){ans++;} }cout<<ans<<endl;return 0;
}

要知道:“string 是一个变量类型,但它本质上依旧是一个字符数组”,那么字符串的查找想法和上面异曲同工。但是要注意我们查找的不是一截字符串而是一个单词,为了避免如(查找“to”单词,而把“Ottoman”单词中的“to”计入)的情况,我们要构造单词,给单词和字符串的左右两边加上空格。
方法一:

#include <iostream>
#include <string>
using namespace std;
int main(){int cnt=0,cnt2=0,l,l2;string s,a;//构造单词,给单词和字符串的左右两边加上空格getline(cin,s);getline(cin,a);s=' '+s+' ';a=' '+a+' '; l=s.size();//单词 l2=a.size();//文章//全部转化为小写(或大小)
//    for(int i=0; i<l2; i++){//      if(a[i]>='A'&&a[i]<='Z'){//          a[i] += 32;
//      }
//  }
//  for(int i=0; i<l; i++){//      if(s[i]>='A'&&s[i]<='Z'){//          s[i] += 32;
//      }
//  }//枚举字符串a中的每一个位置作为起点,进行判断 //toupper函数:小写字母转换为大写字母for(int i=0;i<=l2-(l-1);i++){bool flag = true;for(int j=0;j<l;j++){if(toupper(ss[i+j])!=toupper(s[j])){flag = false;break;}}if(flag == true){cnt++;//cout<<i<<" ";if(cnt==1){cnt2=i;}}}//或者cnt2=a.find(s); if(cnt==0){cout<<"-1";}else{cout<<cnt<<" "<<cnt2;}return 0;
}

方法二:依然是遍历字符串,但是运用了字符串常用函数——find函数。
查找第一次出现的目标字符串:
int ans = s1.find(s2) ; //在S1中查找子串S2,如果查找成功则输出查找到的第一个位置,否则返回-1.
查找从指定位置开始的第一次出现的目标字符串:
int ans = s1.find(s2, 2) ; //从S1的第二个字符开始查找子串S2,

#include <iostream>
#include <string>
using namespace std;
int main() {string a,b;getline(cin,a);getline(cin,b);a=' '+a+' ';b=' '+b+' ';for(int i=0; i<a.size(); i++){if(a[i]>='A'&&a[i]<='Z'){a[i] += 32;}}for(int i=0; i<b.size(); i++){if(b[i]>='A'&&b[i]<='Z'){b[i] += 32;}}if(b.find(a)==string::npos){cout<< -1 <<endl;return 0;}int cnt=0;int ans=b.find(a);int pos=b.find(a);while(pos!=string::npos){cnt++;pos=b.find(a,pos+1);}cout<<cnt<<" "<<ans<<endl;return 0;
}

思路2. 读到文件结尾,逐个字符串去判断。要注意有可能截取的字符串为空格字符串。这个思路时间复杂度较高,运行可能不通过。

#include <iostream>
#include <string>
using namespace std;
int main() {string a,b,c;getline(cin,a);getline(cin,b);b+=' ';for(int i=0; i<a.size(); i++){if(a[i]>='A'&&a[i]<='Z'){a[i] += 32;}}for(int i=0; i<b.size(); i++){if(b[i]>='A'&&b[i]<='Z'){b[i] += 32;}}int cnt=0;int sum=0;int z=0;while(b.size()>0){int x=b.find(' ');//分情况讨论截取的字符串是否为空格字符串。if(x==0){c=b.substr(0,1);b.replace(0,1,"");sum=sum+1;   }else{c=b.substr(0,x);sum=sum+(x+1);    b.replace(0,x+1,"");}if(c==a){cnt++;if(cnt==1){z=sum-x-1; }}      }if(cnt==0){cout<<"-1"<<endl;}else{cout<<cnt<<" ";cout<<z<<endl;}return 0;
}

[NOIP2011]统计单词数相关推荐

  1. 信息学奥赛一本通 1400:统计单词数 | 1954:【11NOIP普及组】统计单词数 | OpenJudge NOI 1.12 05 | 洛谷 P1308 [NOIP2011 普及组] 统计单词数

    [题目链接] ybt 1400:统计单词数 ybt 1954:[11NOIP普及组]统计单词数 OpenJudge NOI 1.12 05:统计单词数 洛谷 P1308 [NOIP2011 普及组] ...

  2. linux统计单词程序,linux统计单词数

    sort +awk+uniq 统计文件中出现次数最多的前10个单词 实例 cat logt.log|sort -s -t '-' -k1n |awk '{print $1;}'|uniq -c|sor ...

  3. 14-luogu-P1308 [NOIP2011 普及组] 统计单词数

    文章目录 问题 [NOIP2011 普及组] 统计单词数 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 我的错误代码 大神 ...

  4. [NOIP2011普及组] 统计单词数

    偷偷拿来记录下萌新的cs路--day30 C++练习 #include<iostream> #include<string> using namespace std;int m ...

  5. 1.12.05 统计单词数

    05:统计单词数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出 ...

  6. P1308 统计单词数

    P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...

  7. python【蓝桥杯vip练习题库】ADV-17统计单词数

    试题 算法提高 统计单词数 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 统计输入英文文章段落中不同单词(单词有大小写之分, 但统计时忽略大小写)各自出现的次数. 输入段落中所含单 ...

  8. c++ 新技能get 统计单词数

    123 DongDong prefers English words to English sentences, so he wants to count the words of a sentenc ...

  9. 信息学奥赛一本通(1400:统计单词数)

    1400:统计单词数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 21054     通过数: 6817 [题目描述] 一般的文本编辑器都有查找单词的功能,该功 ...

最新文章

  1. Linux Kernel TCP/IP Stack — L3 Layer — 邻居发现子系统
  2. webconfig节点值里的文字换行问题
  3. [python爬虫] BeautifulSoup设置Cookie解决网站拦截并爬取蚂蚁短租
  4. CF-346 D. Robot Control(反向建图spfa)
  5. MySQL数据库创建用户root@%
  6. BootStrap笔记-分页
  7. Too many input arguments.
  8. Retrofit之OkhttpCall执行原理详解
  9. JDK和CGLIB生成动态代理类的区别
  10. 华为校招C++开发岗面试经验——软件开发工程师
  11. rac多scan-ip配置
  12. 【论文笔记】Switching Convolutional Neural Network for Crowd Counting
  13. Miracle密码算法开源库(三)分析 :mrarth1.c
  14. 【matlab编程】Matlab版扫雷
  15. CF567C Geometric Progression
  16. 【Unity Shader】(2)半兰伯特模型 构建光照
  17. 借用excel 设计 fasterport 表格,主要是考虑 转回excel 整齐好看
  18. 微信小程序在使用权限时,不弹弹框
  19. 基于HTML仿oppo手机商城电商项目的设计与实现6个页面
  20. python使用目录_python目录操作一

热门文章

  1. 科普一下: 电子的速度很慢,比乌龟还慢, 比蚂蚁还慢!
  2. jQuery.show()详解
  3. ACM 1004. 西西弗斯式的命运
  4. 计算机知识的用处,电脑的用处有哪些呢
  5. 安装Ubuntu系统详细教程
  6. Python在ACM输入模式下用Map代替For
  7. ifstream和ofstream的理解
  8. 解决由于卸载出错导致的Python安装报告0x80070643错误问题
  9. 阿里技术面全A,终面却被产品经理拉下马。。。
  10. python安装错80072ee2_更新Win10系统出现0x80072ee2错误的解决方法