首页 > 其他分享 >洛谷:P1308 [NOIP2011 普及组] 统计单词数

洛谷:P1308 [NOIP2011 普及组] 统计单词数

时间:2024-08-08 20:23:43浏览次数:13  
标签:洛谷 NOIP2011 int text 样例 单词 start 文章 P1308

题目描述

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

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

输入格式

共 2 行。

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

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

输出格式

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

注意:空格占一个字母位

样例1

样例输入 
To
to be or not to be is a question
样例输出
2 0


样例 2

样例输入 
to
Did the Ottoman Empire lose its power at that time
样例输出 
-1
提示

数据范围

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

1\leq  文章长度  \leq10^6

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAXLEN 1000000

// 判断两个字符串是否完全相等
int WordEqual(const char* word, const char* text, int start, int len) {
    for (int i = 0; i < len; i++) {
        if (tolower(word[i]) != tolower(text[start + i])) {
            return 0;
        }
    }
    // 检查单词的前后是否为边界或空格
    if ((start == 0 || text[start - 1] == ' ') && 
        (text[start + len] == ' ' || text[start + len] == '\0')) {
        return 1;
    }
    return 0;
}

int main() {
    char word[11];
    char text[MAXLEN + 1];

    scanf("%s", word);
    getchar();
    fgets(text, MAXLEN + 1, stdin);

    int wordLen = strlen(word);
    int textLen = strlen(text);
    int count = 0;
    int Position = -1;

    for (int i = 0; i <= textLen - wordLen; i++) {
        if (WordEqual(word, text, i, wordLen)) {
            count++;
            if (Position == -1) {
                Position = i;
            }
        }
        // 跳过非单词部分
        while (i < textLen && text[i] != ' ' && text[i] != '\0') {
            i++;
        }
    }

    if (count > 0) {
        printf("%d %d\n", count, Position);
    } else {
        printf("-1\n");
    }

    return 0;
}

标签:洛谷,NOIP2011,int,text,样例,单词,start,文章,P1308
From: https://blog.csdn.net/2402_86069310/article/details/141035656

相关文章

  • 洛谷 P1019 [NOIP2000 提高组] 单词接龙 题解
    暴搜!!暴搜!!暴搜!!重要的事情说三遍#include<bits/stdc++.h>usingnamespacestd;constintN=25;intn,ans,use[N];strings,word[N];voiddfs(strings){intls=s.size();//s的lengthans=max(ans,ls);//求出最长的单词接龙for(inti=0;i<n......
  • 洛谷P2404 自然数的拆分问题——题解
    洛谷P2404题解传送锚点摸鱼环节自然数的拆分问题题目描述任何一个大于\(1\)的自然数\(n\),总可以拆分成若干个小于\(n\)的自然数之和。现在给你一个自然数\(n\),要求你求出\(n\)的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列......
  • 洛谷 P1125 [NOIP2008 提高组] 笨小猴
    [NOIP2008提高组]笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn......
  • 洛谷P1064 金明的预算方案——题解
    洛谷P1064题解传送锚点摸鱼环节[NOIP2006提高组]金明的预算方案题目描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过\(n\)元钱就行”。今天......
  • 洛谷P8869 莲子的软件工程学之警钟长鸣
    洛谷P8869题解传送锚点摸鱼环节[传智杯#5初赛]A-莲子的软件工程学题目背景在宇宙射线的轰击下,莲子电脑里的一些她自己预定义的函数被损坏了。对于一名理科生来说,各种软件在学习和研究中是非常重要的。为了尽快恢复她电脑上的软件的正常使用,她需要尽快地重新编写这么一......
  • 洛谷P3842 线段——题解
    洛谷P3842题解传送锚点摸鱼环节[TJOI2007]线段题目描述在一个\(n\timesn\)的平面上,在每一行中有一条线段,第\(i\)行的线段的左端点是\((i,L_{i})\),右端点是\((i,R_{i})\)。你从\((1,1)\)点出发,要求沿途走过所有的线段,最终到达\((n,n)\)点,且所走的路程长度要尽......
  • 洛谷P1786 帮贡排序
    6.帮贡排序题目背景在absi2011的帮派里,死号偏多。现在absi2011和帮主等人联合决定,要清除一些死号,加进一些新号,同时还要鼓励帮贡多的人,对帮派进行一番休整。题目描述目前帮派内共最多有一位帮主,两位副帮主,两位护法,四位长老,七位堂主,二十五名精英,帮众若干。现在absi2011要......
  • 洛谷P1480 A/B Problem
    4.高精度除以低精度题目叙述:A/BProblem题目描述输入两个整数\(a,b\),输出它们的商。输入格式两行,第一行是被除数,第二行是除数。输出格式一行,商的整数部分。样例#1样例输入#1102样例输出#15提示\(0\lea\le10^{5000}\),\(1\leb\le10^9\)。代码本题为高精......
  • 洛谷B3621枚举元组
    一道经典dfs题,很简单就是让你求1~k能组成多少个n位数。当然耐心足够的朋友可以尝试打表。dfs思路:1.定义数组a来存储每一次的组合,其中a[i]表示第i位的数字;3.递归一定要设定终止条件:如果枚举到了n+1位时,输出数组a并returnCode#include<bits/stdc++.h>usingnamespa......
  • 洛谷P1596 [USACO10OCT] Lake Counting S
    这种普通走迷宫的题,还是最好用bfs,毕竟复杂度是比dfs低的。但我这用dfs讲解。具体思路就不做详解,看代码注释。Code#include<bits/stdc++.h>usingnamespacestd;intn,m;chara[105][105];intdx[8]={0,1,-1,0,-1,1,-1,1};//搜索的八个方向常量,xintdy[8]={1,0......