链接:https://ac.nowcoder.com/acm/contest/217/B
来源:牛客网

msc和mcc

题目描述

msc和mcc是一对好朋友,有一天他们得到了一个长度为n的字符串s.

这个字符串s十分妙,其中只有’m’,’s’和’c’三种字符。

定义s[i,j]表示s中从第i个到第j个字符按顺序拼接起来得到的字符串。

定义一个字符串t的子序列为从t中选出一些位置并且将这些位置上面的字符按顺序拼接起来得到的字符串。

两个子序列重合当且仅当存在一个位置x使得两个子序列同时选择了位置x。

由于msc和mcc是一对很好很好的好朋友,所以她们希望选择两个数字x和y满足1≤x≤y≤n使得s[x,y]中同时存在两个**不重合的子序列**使得其中一个是’msc’且另外一个是’mcc’

现在给出n和字符串s,问她们可以选出多少对不同的(x,y)。

输入描述:

第一行一个正整数n,表示字符串s的长度。

第二行一个长度为n的字符串s,其中s只包含字符’m’,’s’和,’c’。(n<100000)

输出描述:

一行一个正整数,表示答案。
题目大意:给一个字符串,求有多少个区间内部存在msc 和 mcc 两个子序列(并且二者不存在公共元素)
题目分析:由于n是1e5级别的,并且是要对区间进行计数,所以只能在O(N)的时间复杂度下得到最终结果,可以想到枚举区间左端点O(N),然后就需要O(1)得到右端点的个数,右端点的个数也就是n-符合条件的最小右端点,所以这个时候只能预处理,而可以知道满足条件的长度为6的子序列只有8种,所以可以预处理出每种情况下的每一个元素后一个元素的位置,然后就能O(1)得到最小右端点了.
 #include<iostream>
#include<cstring>
#include<cmath>
#include<map>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
char ch[][]={
"",
"",
"",
"",
"",
"",
"",
""
};
int nx[][],kt[];
char s[];
int main(){
cin>>n;
scanf("%s",s+);
for(int i=;i<=n;i++){
if(s[i]=='m')kt[i]=;
else if(s[i]=='s')kt[i]=;
else kt[i]=;
}
for(int i=;i<;i++){
int pos=n+;
for(int j=n;j>=;j--){
nx[j][i]=pos;
if(kt[j]==i)pos=j;
}
}
ll ans=;
for(int i=;i<=n;i++){
int ed=n+;
for(int j=;j<;j++){
int pos=i-;
for(int k=;k<&&pos<=n;k++){pos=nx[pos][ch[j][k]-''];}
ed=min(ed,pos);
}
ans+=n-ed+;
}
cout << ans << endl;
return ;
}

 

[Wannafly挑战赛28][B msc和mcc][预处理+枚举]的更多相关文章

  1. Wannafly挑战赛28

    总结- A-开始觉得是找规律,最开始模拟当时我觉得如果L达到1e9的范围的话,岂不是要加1e9次,模拟也就没有认真写,现在想来,后面由于加的不再是1,而是我前面的值,这样相当了一个斐波那契的类型,而斐 ...

  2. Wannafly挑战赛28 Solution

    A:msc和mas Solved. 考虑斐波那契数列,即最多加45次即会超过1e9,直接暴力即可 #include <bits/stdc++.h> using namespace std; ...

  3. Wannafly挑战赛26-F. msc的棋盘(模型转化+dp)及一类特殊的网络流问题

    题目链接 https://www.nowcoder.com/acm/contest/212/F 题解 我们先考虑如果已知了数组 \(\{a_i\}\) 和 \(\{b_i\}\),如何判断其是否合法. ...

  4. Wannafly挑战赛25游记

    Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...

  5. 【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)

    [Wannafly挑战赛29F]最后之作(Trie树,动态规划,斜率优化) 题面 牛客 题解 首先考虑怎么计算\([l,r]\)这个子串的不同的串的个数. 如果\(l=1\),我们构建\(Trie\) ...

  6. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  7. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  8. Wannafly挑战赛21A

    题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...

  9. Wannafly挑战赛24游记

    Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...

随机推荐

  1. HDU 1005 Number Sequence(数论)

    HDU 1005 Number Sequence(数论) Problem Description: A number sequence is defined as follows:f(1) = 1, ...

  2. shell 流程控制语句

    case语句 case $变量名 in "值1")   如果变量的值等于值1,则执行程序1 ;;  "值2")   如果变量的值等于值2,则执行程序2 ;;   ...

  3. int(a) 和 (int &) a 及 数据存储地址的探究

    做题做到一个很有意思的题 void main() { float a = 1; cout << boolalpha << ((int)a == (int &)a); f ...

  4. 阿里十年架构经验总结的Java学习体系

    Java学习这一部分其实是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个 ...

  5. unity中键盘WASD控制。(WS控制物体前后移动,AD控制左右旋转。)

    private float rotateSpeed = 30f; private float movespeed = 5; void FixedUpdate() { //第一种控制移动 float h ...

  6. jdk重装后com.sun.tools.javac.Main is not on the classpath的问题 .

    在重装了JDk之后,在编译工程的时候出现如下错误: com.sun.tools.javac.Main is not on the classpath.Perhaps JAVA_HOME does no ...

  7. Date和Timestamp区别

    主要是精度问题,date没有ms,而timestamp是有ms的,所以date的精度要低于timestamp. 而且二者可以互相转换. 除此之外,没有什么不同,

  8. MYSQL基础知识小盲区

    MYSQL必会的知识 命令行 启动mysql:     mysql  -u用户名 -p密码 显示表中的各列详细信息:    show columns form tablename  等价于  desc ...

  9. Linux7 下重新安装YUM

    所有操作均在ROOT用户下,系统版本是Linux7.0 X86_64: 一.删除原有YUM # rpm -aq|grep yum|xargs rpm -e --nodeps 二.下载yum,注意自己的 ...

  10. Java进程和线程

    进程是资源分配和任务调度的基本单位, 进程就是包含上下文切换的程序执行时间总和=CPU加载上下文环境+CPU执行+CPU保存上下文环境,可以理解为时间片段: 进程的颗粒度太大了,将进程分块,按照a,c ...