【日常学习】【字符串处理】noip2011普及组第2题 统计单词数题解

博客讲述了在NOIP2011普及组比赛中遇到的一道字符串处理题目,要求统计给定单词在文章中的出现次数和首次出现位置。文章介绍了题目要求、输入输出格式,并分享了编程实现过程中的注意事项,如getline()函数的使用和substr()函数的细节。博主还提及了代码中学习到的新函数s.erase(),并表达了对更好解法的期待。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这又是一道成功加入“容易吗”系列的基础题= =原本很简单,可是我一开始太大意看错了题,以为是让输出该单词是第几个单词,实际上应该输出该单词的首字母在第几个位置;改过后只得了二十分,看了一组数据,原来第一个单词前面可以有前导空格——幸亏其他单词前没有,否则还真不知道怎么办;实现的时候又出了各种问题。于是我决定总结一下。

题目:

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

输入格式:
  输入文件名为stat.in ,2 行。 
  第1 行为一个字符串,其中只含字母,表示给定单词; 
  第2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
  输出文件名为stat.out 。 
  只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数-1。

1≤ 单词长度≤10。 
1≤ 文章长度≤1,000,000。 


二话不说,先上代码

//tongjidancigeshu
#include<iostream>
#include<string>
#include<cctype>//for tolower
#include<cstdio>
using namespace std;

inline string change(string s){//wxjlzbcd神犇表示,加inline后变成内联函数,内联到宏中,可以稍微加速,暴搜可用,但是我不大了解,慢慢学习
	for (int i=0;i<s.length();i++) s[i]=tolower(s[i]);
	return s;//don't forget//刚开始竟然忘了return s,导致出现错误好像是访问无效内存rewritten
} 

int main(){
	freopen("1.txt","r",stdin);//freopen输入输出,粘代码党记得删除O(∩_∩)O~再次强化要用cstdio头文件
	freopen("2.txt","w",stdout);
	string point,s,words;//point记录要查找的单词,s是文章整体读入,words是截取的文章中的单个单词
	getline(cin,point);//注意:point一定要用getline读入!否则下一个getline(cin,s)会直接读取point后的回车,导致s=''!
	point=change(point);//tolower only use for single char tolower位于cctype头文件中,只用于单个字符
	getline(cin,s);//if the third position is empty it's \n= =关于这一点,正文中会介绍↓
	s=change(s);
	int i,pos=0,anspos=-1,ans=0;//anspos要设为-1,如果设为0,由于初始位置也是0,初始位置就是第一个
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值