当前位置: 首页 > article >正文

P1308 [NOIP2011 普及组] 统计单词数题解

First_题目心得及题干

心得

今天我做了这道查找单词数量的题目,这道题目可谓是很经典的,也非常的简单,接下来直接看题目吧

题目

传送门

题目描述

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

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

noip2011 普及组第 2 题

Second_题目分析

题目分析

这题首先

我们要用整行输入字符串,getline就可以解决

getline(cin,s);
getline(cin,str);

然后我们需要把要比较的两个字符串统统转化为小写,方便判段

void mytolower(string& s)
{
    int len=s.size();
    for(int i=0;i<len;i++)
	{
        if(s[i]>='A'&&s[i]<='Z')
		{
            s[i]+=32;
        }
    }
}

然后我们只需要一个一个遍历过去寻找就可以了,但是这样第一个点是过不去的,因为这样一个单词中出现两次同一个和你要比较的这个单词的字母,就会出BUG了,我们这时候找到一个开头一样的直接把i和j加一个就好了。遍历完一小遍就判断是不是那个单词是的话直接把答案数加一个就好了

for(int i = a;i <= len2;i++)
	{
		for(int j = i;j <= len1;j++)
		{
			int x = 0;
			//cout<<str[i]<<endl<<s[j]<<endl;
			if(str[i] == s[j])
			{
				
				flg = 1;
				x++;
				i++,j++;
			}
			else
			{
				if(flg = 1)
				{
					break;
				}
				flg = 0;
			}
			//cout<<x<<endl;
			if(x >= len1 - 1)
			{
				ans++;
			}
		}
	}

但是题目呢还叫我们求第一次出现时,单词首字母在文章中的位置这个好办,在代码中加上一下代码便可

	m = i;
	if(m < f)
	{
		f == m;
    }

m相当于一个出现的字母的下标,f记录这个下标的最小值,就可以完成这一个操作

最后别忘了,没有这个单词出现的话输出-1哦!

代码code

#include <bits/stdc++.h>
using namespace std;
#define int long long
string s,str;
int len1,len2,ans,f,m,a = 1;
bool flg;
void mytolower(string& s)
{
    int len=s.size();
    for(int i=0;i<len;i++)
	{
        if(s[i]>='A'&&s[i]<='Z')
		{
            s[i]+=32;
            //s[i]=s[i]-'A'+'a';
        }
    }
}
signed main() 
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	getline(cin,s);
	getline(cin,str);
	mytolower(s);
	mytolower(str);
	//cout<<s<<" "<<str<<endl;
	len1 = s.length();
	len2 = str.length();
	s = ' ' + s;
	str = ' ' + str;
	//cout<<len1<<" "<<len2<<endl;
	for(int i = a;i <= len2;i++)
	{
		for(int j = i;j <= len1;j++)
		{
			int x = 0;
			//cout<<str[i]<<endl<<s[j]<<endl;
			if(str[i] == s[j])
			{
				
				flg = 1;
				x++;
				m = i;
				if(m < f)
				{
					f == m;
				}
				i++,j++;
			}
			else
			{
				if(flg = 1)
				{
					break;
				}
				flg = 0;
			}
			//cout<<x<<endl;
			if(x >= len1 - 1)
			{
				ans++;
			}
		}
	}
	if(ans == 0)
	{
		cout<<-1;
	}
	else
	{
		cout<<ans<<" "<<f;
	}
	return 0;
}

Third_谢礼

Thank you 观看我的博客及题解,如有疑惑及错误请私信我


http://www.kler.cn/a/406346.html

相关文章:

  • java实现小程序接口返回Base64图片
  • RocketMQ文件刷盘机制深度解析与Java模拟实现
  • BugJson因为json格式问题OOM怎么办
  • LINUX系统编程之——环境变量
  • 1、HCIP之RSTP协议与STP相关安全配置
  • 本地部署与外部部署有何不同?
  • [开源重构]Search(Elasticsearch/OpenSearch) Sync Tool
  • c++基础语法
  • shell脚本(三)
  • Java教程:SE进阶【十万字详解】(中)
  • 移动语义和拷贝语义的区别以及智能指针
  • 数据结构--并查集
  • 比rsync更强大的文件同步工具rclone
  • 解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
  • 半导体工艺与制造篇5 光刻
  • 40分钟学 Go 语言高并发:并发下载器开发实战教程
  • 「Chromeg谷歌浏览器/Edge浏览器」篡改猴Tempermongkey插件的安装与使用
  • 倒计时功能分享
  • 数据结构-8.Java. 七大排序算法(上篇)
  • Linux 手动升级软件保姆级教程,适用所有软件,不限于麒麟等国产系统
  • 【Golang】协程
  • 迁移学习理论与应用
  • 力扣--LRC 142.训练计划IV
  • Ubuntu ESP32开发环境搭建
  • 五天SpringCloud计划——DAY2之使用Docker完成项目的部署
  • Excel的图表使用和导出准备