[NOIP2011]统计单词数
题目:[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]统计单词数相关推荐
- 信息学奥赛一本通 1400:统计单词数 | 1954:【11NOIP普及组】统计单词数 | OpenJudge NOI 1.12 05 | 洛谷 P1308 [NOIP2011 普及组] 统计单词数
[题目链接] ybt 1400:统计单词数 ybt 1954:[11NOIP普及组]统计单词数 OpenJudge NOI 1.12 05:统计单词数 洛谷 P1308 [NOIP2011 普及组] ...
- linux统计单词程序,linux统计单词数
sort +awk+uniq 统计文件中出现次数最多的前10个单词 实例 cat logt.log|sort -s -t '-' -k1n |awk '{print $1;}'|uniq -c|sor ...
- 14-luogu-P1308 [NOIP2011 普及组] 统计单词数
文章目录 问题 [NOIP2011 普及组] 统计单词数 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 我的错误代码 大神 ...
- [NOIP2011普及组] 统计单词数
偷偷拿来记录下萌新的cs路--day30 C++练习 #include<iostream> #include<string> using namespace std;int m ...
- 1.12.05 统计单词数
05:统计单词数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出 ...
- P1308 统计单词数
P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...
- python【蓝桥杯vip练习题库】ADV-17统计单词数
试题 算法提高 统计单词数 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 统计输入英文文章段落中不同单词(单词有大小写之分, 但统计时忽略大小写)各自出现的次数. 输入段落中所含单 ...
- c++ 新技能get 统计单词数
123 DongDong prefers English words to English sentences, so he wants to count the words of a sentenc ...
- 信息学奥赛一本通(1400:统计单词数)
1400:统计单词数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 21054 通过数: 6817 [题目描述] 一般的文本编辑器都有查找单词的功能,该功 ...
最新文章
- Linux Kernel TCP/IP Stack — L3 Layer — 邻居发现子系统
- webconfig节点值里的文字换行问题
- [python爬虫] BeautifulSoup设置Cookie解决网站拦截并爬取蚂蚁短租
- CF-346 D. Robot Control(反向建图spfa)
- MySQL数据库创建用户root@%
- BootStrap笔记-分页
- Too many input arguments.
- Retrofit之OkhttpCall执行原理详解
- JDK和CGLIB生成动态代理类的区别
- 华为校招C++开发岗面试经验——软件开发工程师
- rac多scan-ip配置
- 【论文笔记】Switching Convolutional Neural Network for Crowd Counting
- Miracle密码算法开源库(三)分析 :mrarth1.c
- 【matlab编程】Matlab版扫雷
- CF567C Geometric Progression
- 【Unity Shader】(2)半兰伯特模型 构建光照
- 借用excel 设计 fasterport 表格,主要是考虑 转回excel 整齐好看
- 微信小程序在使用权限时,不弹弹框
- 基于HTML仿oppo手机商城电商项目的设计与实现6个页面
- python使用目录_python目录操作一