哈尔滨理工大学软件与微电子学院程序设计竞赛(新生赛)-同步赛 S-小乐乐与字符串

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述
在庆祝祖国母亲70华诞之际,老师给小乐乐出了一个问题。大家都知道China的英文缩写是CHN,那么给你一个字符串s,你需要做的是统计s中子串“CHN”的个数。
子串的定义:存在任意下标a < b < c,那么“s[a]s[b]s[c]”就构成s的一个子串。如“ABC”的子串有“A”、“B”、“C”、“AB”、“AC”、“BC”、“ABC”。

输入描述:
输入只包含大写字母的字符串s。(1 ≤ length ≤ 8000)
输出描述:
输出一个整数,为字符串s中字串“CHN”的数量。
示例1
输入
CCHNCHN
输出
7
示例2
输入
CCHNCHNCHNCHN
输出
30

这题居然没有做出来,心塞塞,看了别人的代码有一种醍醐灌顶的感觉(该死的菜)

先反思一下,做的时候脑袋很糊,不小心看了下某企鹅接收到了一些与我有关的消息通知……然后……三心二意……(借口……不认真做题还有讲道理了……不讲道理……) 打代码打着打着想保留这个子序列的顺序,刚开始是想开数组存他和他前面的字符数量来着,后来做到一半发现没有必要啊(事实上的确没必要)

但是没必要的这个方式我写到一半又卡住了可能是还没想太明白……所以打不连贯,

在这里先贴代码再解释吧

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;


int main()
{
	string s;
    cin>>s;
    long long  a=0,b=0,ans=0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='C') a++;
        else if(s[i]=='H') b+=a;
        else if(s[i]=='N') ans+=b;
    }
    cout<<ans<<endl;
	return 0;
} 

仔细看一下代码,a存的是字符串当前从0开始的c的个数,每次遇到h都会加上a的数量(这是因为之前的每个c都可以和h一起作为子序列cha的一个小部分,)同理,到最后那个a也是一样前面的每一种ch都可以和遇到的a一起成为最终答案的一个可能。(怎么感觉讲起来绕绕的……

结束了

发布了106 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44702847/article/details/102980051