[NOIP2011 普及组] 统计单词数

题目描述

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

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

输入格式

共 \(2\) 行。

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

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

输出格式

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

样例 #1

样例输入 #1

To

to be or not to be is a question

样例输出 #1

2 0

样例 #2

样例输入 #2

to

Did the Ottoman Empire lose its power at that time

样例输出 #2

-1

提示

数据范围

$1\leq $ 第一行单词长度 \(\leq10\)。

$1\leq $ 文章长度 \(\leq10^6\)。

noip2011 普及组第 2 题

————————————————————————————————————————————————————以上为题目

这道题的恶心点在于如何比较以及如何记录当前单词的位置,可以知道题目要求不论大小写的比较,因此我们必须将模式串和比较串统一大写或者统一小写然后调用strcmp函数来比较两者是否完全一至。

然后就是如何分割出单词,这里使用string库里的strtok函数

其定义如下

char *strtok(char *str, const char *delim);

其中Str为要被分割的字符串,delim为作为分割符的字符串

strtok函数会根据delim里的每一个单字符作为分隔符,将Str分割

strtok在切割字符串的时间,实际上就是将分割符的字符delimiter替换为'\0'并且返回首地址。

例如

点击查看代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
int main()
{
char S[50] = { " ABC DEF GH QEL" };
char Del[2] = " ";
char* K = strtok(S, Del);
while (K != NULL)
{
printf("%s %d", K, K - S);
K = strtok(NULL, Del);//第二次调用要传入NULL,用来定位下一次的切割
}
return 0;
}

strtok函数的作用原理是strtok会从传入的字符指针开始向后扫瞄直到找到第一个非Del字符里的字符并标记为初始位置不妨叫他为Str,他是一个字符指针,此位置即为最后返回值。然后继续向后扫瞄直到找到Del字符里的字符为止,strtok会将这个字符直接在原字符串里替换为\0,然后返回Str这个字符指针,因此调用strtok会将原字符串改变。当找到末尾时,strtok回返回NULL,若在模式串中找不到分隔符,则直接原地返回字符串的首地址。

注意第二次分割参数传入NULL

因此借用strtok,我们可以以空格为分隔符来将单词分割出来并且得知其首字母在原字符串中的指针位置K,我们只需要让K减去模式串的首地址即可得知这个单词在模式串中的位置

有如下代码

点击查看代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
bool MyStrcmp(char* S, char* Pattern)
{
int i;
for (i = 0; S[i] && Pattern[i]; i++)
{
if (S[i] == Pattern[i] || S[i] - 32 == Pattern[i] || S[i] + 32 == Pattern[i])
continue;
else
break;
}
if (!S[i] && !Pattern[i])
return 1;
else
return 0;
}
int main()
{
char S[10];
scanf("%s", S);
char Pattern[1000000];
getchar();
gets(Pattern);
int cnt = 0;
int Position = -1;
char Del[2] = " ";
char* K = strtok(Pattern, Del);
while (K != NULL)
{
if (MyStrcmp(S, K))
{
cnt++;
if (Position == -1)
Position = K - Pattern;
}
K=strtok(NULL, Del);
}
if (Position != -1)
printf("%d %d", cnt, Position);
else
printf("-1");
return 0;
}

这里使用的逐个字母枚举比较,当然也可以将字符串全部转换为大写或者小写然后strcmp
大小写转换可以使用函数toupper(char c)//将字符c转换为大写,tolower(char c)//将字符c转为小写,不过这是单字符的转换,可以使用循环将字符串里的字母统一大小写

洛谷P1308统计单词数,strtok函数的使用以及对于单词分割的一些思考的更多相关文章

  1. 洛谷 P1308 统计单词数

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

  2. 洛谷 P1308 统计单词数【string类及其函数应用/STL】

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

  3. (水题)洛谷 - P1308 - 统计单词数

    https://www.luogu.org/problemnew/show/P1308 简单哈希一下判断,练练手. 注意fgets()的用法,第一个参数传存储位置,第二个参数传内存上限,第三个传std ...

  4. 洛谷P1308 统计单词数

    原题链接:https://www.luogu.org/problem/P1308 #include<iostream> #include<cstring> #include&l ...

  5. java实现洛谷P1308统计单词数

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

  6. 洛谷 P1308 统计单词数【字符串+模拟】

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

  7. P1308 统计单词数

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

  8. 字符串--P1308 统计单词数

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

  9. 洛谷 P1308 统计单词数【字符串处理】

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

  10. P1308 统计单词数(cin,getline() ,transform() )

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

随机推荐

  1. Xmanager连接linux服务器的桌面

    在办公室使用xshell通过22端口访问linux服务器大家都很熟悉,但有的时候在办公室要远程linux服务器上的桌面应用,该如何实现. 环境准备 客户端:win10 服务器:centos7.9 一. ...

  2. python进度条实现的几种方法

    一.普通进度条(time实现) import time def progress_bar(): for i in range(101): print(f'\rProgress: {"#&qu ...

  3. 定期发送邮件功能-outlook与腾讯邮箱

    一.背景:定期发送邮件功能挺好用的,可以帮忙我们在特殊的时间点发送邮件,以及实现无人推送的功能 二.outlook的实现1.首先编辑好邮件保存至草稿 2.选项-延迟传递,设置不早于传递的时间,点击发送 ...

  4. 4.Prometheus之存储及WAL

    一.整体介绍 二.block 2.1 head block 三.WAL(Write-ahead logging, 预写日志) 3.1 数据流向 四.和存储相关的启动参数 五.总结 一.整体介绍 Pro ...

  5. CentOS下PHP7安装mysqlnd模块

    单独安装mysqlnd驱动 如果是centos下的yum安装方式,那么可以参考后续操作. 因为mysqlnd是mysql原生的驱动,如果已经安装了php-mysql,则需要先卸载,否则会遇到冲突. 先 ...

  6. Oracle 监控客户端的连接数量趋势

    Oracle 监控客户端的连接数量趋势 背景 前期简单总结了table方式将表信息展示出来的方法 但是感觉这样非常不直观. 想着能够做出一个趋势来. 时序数据库的最佳的使用方式. 之前的确是太靠自己的 ...

  7. [转帖]【VIM】多行缩进空格与删除

    向前或向后缩进一个TAB 按ctrl + v组合键进入Visual Line模式,可使用方向键选择多行: 按<或>,进行向前或向后缩进tab. 缩进n个TAB,按n+<或> 多 ...

  8. [转帖]ls 只显示目录

    https://www.cnblogs.com/lavin/p/5912369.html 只显示目录: ls -d */ 在实际应用中,我们有时需要仅列出目录,下面是 4 种不同的方法. 1. 利用 ...

  9. [转帖]用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

    https://www.zhihu.com/people/javajia-gou-ji-zhu-44/posts   JDK命令行工具 在JDK的开发包中,除了大家熟知的java.exe和javac. ...

  10. 高性能Redis服务器注意事项

    摘要 昨天简单理了理安装与配置相关的 但是很多比较重要的核心性能参数并没有进行学习与探讨 就基于昨天理解不深入的地方进行进一步的学习与了解 希望能够提高Redis-Server的性能. 第一部分: 规 ...