首页 > 编程语言 >题解 洛谷 Luogu P1308 [NOIP2011 普及组] 统计单词数 C++

题解 洛谷 Luogu P1308 [NOIP2011 普及组] 统计单词数 C++

时间:2024-11-01 14:45:11浏览次数:3  
标签:cnt 洛谷 NOIP2011 题解 pos cin 单词 && size

题目传送门:

P1308 [NOIP2011 普及组] 统计单词数 - 洛谷 | 计算机科学教育新生态icon-default.png?t=O83Ahttps://www.luogu.com.cn/problem/P1308getline() 会清除使当次 getline() 终止的换行,而 cin 不会

因此 cin 以换行终止,之后还需要 getline() 的话,需要用 getchar() 吞换行

Linux 的一些相关环境中,tolower 还有一个宏版本,洛谷 C++ 环境就是这样的

在此情况下,要将 tolower 当作函数调用时,需要用 "::" 指明

每次用 find() 找,找得到且判定为单词,cnt 就 ++

单词判定及后续处理细节在代码注释里

代码:

#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
    string s, t;
    cin >> s;
    getchar();
    getline(cin, t);
    transform(s.begin(), s.end(), s.begin(), ::tolower);
    transform(t.begin(), t.end(), t.begin(), ::tolower);
    int pos = 1E9, cnt = 0, p, a = 0;
    while ((p = t.find(s)) != -1)
    {
        if (s.size() == t.size() /* t == s */ \
            || (p == 0 && t[p + s.size()] == ' ') /* p 在 t 起始位置,且 p + s.size() 子串后是单词分割符 */ \
            || (p > 0 && t[p - 1] == ' ' && p + s.size() == t.size()) /* p + size()子串前是单词分隔符,后是 t 末尾 */ \
            || (p > 0 && t[p - 1] == ' ' && t[p + s.size()] == ' ')) /* p + size() 子串前后都是单词分隔符 */
            cnt++, pos = (p + a < pos ? p + a : pos);
        a += p + s.size();//pos 代表在原始 t 中第一个出现的位置,但 t 进行了很多次 erase 操作,需要统计前面删掉的长度,这样的 t.find(s) + a 才能赋值给 pos
        t.erase(0, p + s.size());//
        while(t[0] != ' ') t.erase(0, 1), a++;//每次需要删掉整个单词,而不一定是 (0, p + s.size())。如对于 s = i,t = iii,第二次删除后 t = i,这是不对的,应该一次就把 t 删完
    }
    if (!cnt) cout << -1;
    else cout << cnt << ' ' << pos;
    return 0;
}

标签:cnt,洛谷,NOIP2011,题解,pos,cin,单词,&&,size
From: https://blog.csdn.net/qwq_ovo_pwp/article/details/143431860

相关文章

  • P11228 [CSP-J 2024] 地图探险 题解
    模拟第一眼,可能有人回想起dfs.但因为起点终点,并且走的步数都告诉你了,所以直接模拟就行.注意起始点也算被走过,所以可以用一个标记数组,判断当前格子有没有被走过.代码#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;int......
  • AtCoder Beginner Contest 376 题解
    AtCoderBeginnerContest376题解AtCoderBeginnerContest376A-CandyButton#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;voidsolve(){ intn,c;cin>>n>>c; intpre=-1; intans=0; for(inti=1;i<=n;i++)......
  • 洛谷 P2606 [ZJOI2010] 排列计数 题解
    题目链接[ZJOI2010]排列计数-洛谷题解看到\(p_i>p_{\lfloori/2\rfloor}\)这个条件,可能一开始不会有什么想法。但是如果我们换种写法,即:\(p_i<p_{2i}\landp_i<p_{2i+1}\)。这样我们就能很容易看出来,这是小根堆的形式。现在我们从根节点开始考虑,假设左子树的大小......
  • 洛谷B2064
    B2064斐波那契数列-洛谷|计算机科学教育新生态斐波那契数列题目描述斐波那契数列是指这样的数列:数列的第一个和第二个数都为$1$,接下来每个数都等于前面$2$个数之和。给出一个正整数$a$,要求斐波那契数列中第$a$个数是多少。输入格式第1行是测试数据的组数n,后面......
  • P1779 魔鬼杀手 题解&&思路
    P1779魔鬼杀手题解&&思路题目链接。分析题目性质我们发现假如有状态表示\(M\)个方案选或不选,那么这个状态有唯一确定的结果,即结果不会随着施法的顺序而改变。考虑\(dp.\)我们从题目出发,发现每个方案有单个攻击或者集体攻击,想一想从这个方面考虑。又由于每一个方案是可......
  • 洛谷Python顺序结构题解合集
    P5705【深基2.例7】数字反转a=s[0]b=s[1]c=s[2]d=s[4]print(f"{d}.{c}{b}{a}")P5706【深基2.例8】再分肥宅水ans=float(a[0])/int(a[1])beizi=2*int(a[1])print(f"{ans:.3f}\n{beizi}")P5708【深基2.习2】三角形面积p=0.5*(a+b+c)ans=pow((p*(p-a)*(p-b)*(p-c)),0.5......
  • Navicat 连接 MySQL 失败:2002-can‘t connect to server on localhost(10061)问题解决
    连接不上问题可能有如下原因服务器安全组中没有配置3306端口mysql服务端口只开放本地了如下:修改/etc/mysql/mysql.conf.d/mysqld.cnf中bind-address和mysqlx-bind-address注释掉重启mysql服务systemctlrestartmysqlmysql登录用户的host为localhost只允......
  • CATIA许可证常见问题解答
    在使用CATIA软件的过程中,许可证问题常常是用户关心的焦点。为了帮助大家更好地理解和解决这些问题,我们整理了一份CATIA许可证常见问题解答,希望能为您提供便捷的参考。问题一:如何激活CATIA许可证?解答:激活CATIA许可证通常需要访问软件的官方平台或使用特定的许可证管理工具。您需......
  • 20241031模拟赛题解
    T1题目描述给定一个圆形蛋糕,被\(n\)条切割线分成\(n\)个扇形蛋糕块,按照顺时针编号,第\(i\)块上有\(a_i\)个草莓,第\(i\)条切割线到第\(i+1\)条切割线之间的部分是第\(i\)块蛋糕。Alice和Bob流选择切割线,假设Alice选择了第\(i\)条切割线,Bob选择了第\(j\)条......
  • POI2011/洛谷P3523 DYN-Dynamite
    前言Link本来一个很直观的题面,非要搞形式化题意反而使题意变得非常迷惑。题意有一栋树形建筑,其中有一些点摆放了TNT,树边上都摆放了引信,引信的燃烧时间为\(1\)秒\(/\)边,现在你要选择\(m\)个点同时点燃引信(起爆),则显然TNT被引爆的时间为到离它最近的起爆处的距离,请你求......