题面

官方题解

模拟赛题解

题解概述:





定义符号AB表示序列A是序列B的子序列,A!B反之。

设操作序列为I,则有AI,B!I,CI,D!I。

可得出条件①B!C且D!A,所以我们只要讨论满足这个条件的情况。

分情况讨论:

  1. c1=c2,则可以进行操作c1,得到的状态仍满足条件①;
  2. c1!=c2,且B'!~C,此时可以进行操作c1;
  3. c1!=c2,且D'!~A,此时可以进行操作c2;
  4. c1!=c2,且D'A,B'C,此时无法进行操作,此情况无解;

    我们还发现第4种情况下,B=...xyxy,D=...yxyx,且B,D长度相等。

    另外,当B以xy结尾,D以yx结尾时,此情况一定无解。

这就证明了当满足条件①时,无解当且仅当B以xy结尾,D以yx结尾。

这样就可以对于数对(x,y)的每一个x,求出对应y的范围(一段区间),然后把其中以yx结尾的y减去(用前缀和实现),就可以得到每一个x的答案了。

总复杂度O(n)。

代码:

#include<bits/stdc++.h>
using namespace std;
#define N 2000007
#define ll long long
int a[N],b[N],s[3][3][N];
char ch[N];
int tar(char c)
{
if(c=='R')return 0;
if(c=='B')return 1;
return 2;
}
int main()
{
//freopen("stone.in","r",stdin);
//freopen("stone.out","w",stdout);
int n,m,i,j,l,r;
ll ans=0;
scanf("%s",ch+1);
n=strlen(ch+1);
for(i=1;i<=n;i++)
a[i]=tar(ch[i]);
scanf("%s",ch+1);
m=strlen(ch+1);
for(i=1;i<=m;i++)
b[i]=tar(ch[i]);
for(int x=0;x<=2;x++)
for(int y=0;y<=2;y++)
{
for(i=2;i<=m;i++)
if(b[i-1]==x&&b[i]==y)
s[x][y][i]=1;
for(i=1;i<=m;i++)
s[x][y][i]+=s[x][y][i-1];
}
l=1,r=1;
while(r<m&&b[r]!=a[1])r++;
ans=r-l+1;
for(i=2;i<=n;i++)
{
if(l<=m&&a[i-1]==b[l])l++;
if(l>m)break;
if(r<m)
{
r++;
while(r<m&&b[r]!=a[i])r++;
}
if(l>r)continue;
int x=a[i-1],y=a[i];
ans+=r-l+1;
if(x!=y)ans-=s[y][x][r]-s[y][x][l-1];
}
printf("%lld\n",ans);
return 0;
}

总结:这个问题通过设出操作序列I,通过子序列的模型来描述题目条件,然后排除一些显然不合法的情况,确立一个有解的基本条件,再在这个条件下递归地讨论一种情况合不合法,最终发现无解的情况比较特殊,于是得到了一个易于判断的无解的充要条件,问题解决。

CF264D - Colorful Stones 题解的更多相关文章

  1. 洛谷CF264D Colorful Stones(子序列匹配,思维)

    洛谷题目传送门 神仙思维题. 对于两个字符串的匹配问题,似乎之前蒟蒻写的HAOI2010最长公共子序列题解中提到的建网格图模型是一种套路? 给一个稍微强一点的样例(把字母换成了ABC) AABCB B ...

  2. codechef Jewels and Stones 题解

    Soma is a fashionable girl. She absolutely loves shiny stones that she can put on as jewellery acces ...

  3. codeforces 264D Colorful Stones

    题目 题目来自于rng_58Orz. 算法 讨论某个状态\((x,y)\)是否可达,\(x\)是狐狸到达的石头,\(y\)是猫的. 题解说,如果满足以下条件,那么它就是可到达状态: \(t[0..y] ...

  4. 2017 ACM-ICPC亚洲区域赛北京站J题 Pangu and Stones 题解 区间DP

    题目链接:http://www.hihocoder.com/problemset/problem/1636 题目描述 在中国古代神话中,盘古是时间第一个人并且开天辟地,它从混沌中醒来并把混沌分为天地. ...

  5. CF1119A Ilya and a Colorful Walk 题解

    Content 有一个长度为 \(n\) 的数组 \(a_1,a_2,a_3,...,a_n\),试求出两个不相等的数之间的距离的最大值. 数据范围:\(3\leqslant n\leqslant 3 ...

  6. CF433B Kuriyama Mirai's Stones 题解

    Content 有一个长度为 \(n\) 的数组 \(a_1,a_2,a_3,...,a_n\).有 \(m\) 次询问,询问有以下两种: \(1~l~r\),求 \(\sum\limits_{i=l ...

  7. Codeforces Round #162 (Div. 2) A~D 题解

    A. Colorful Stones (Simplified Edition) time limit per test 2 seconds memory limit per test 256 mega ...

  8. HDU 全国多校第四场 题解

    题解 A AND Minimum Spanning Tree 参考代码: #include<bits/stdc++.h> #define maxl 200010 using namespa ...

  9. [SinGuLaRiTy] 组合数学题目复习

    [SinGuLaRiTy] Copyright (c) SinGuLaRiTy 2017.  All Rights Reserved. [CQBZOJ 2011] 计算系数 题目描述 给定一个多项式( ...

随机推荐

  1. ReentrantLock使用示例

    /** * ReentrantLock是独占锁 * Lock锁的使用,把锁和要用锁同步的代码放在一起,这里就是放在Printer类中了 * 获取到锁后,最后要在finally代码块中手动释放锁 */ ...

  2. 我自己整理的 Linux 常用命令

    1.查看文件安装路径: 由于软件安装的地方不止一个地方,所有先说查看文件安装的所有路径(地址). 这里以 xsp 为例.比如说我安装了xsp,但是不知道文件都安装在哪些地方.放在哪些文件夹里,可以用下 ...

  3. 【转】.Net程序员学习Linux最简单的方法

    有很多关于Linux的书籍.博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...

  4. json工具类(三)——net包

    package com.ruoyi.common.utils.json; import java.util.List; import java.util.Map; import net.sf.json ...

  5. Linux环境下如何计算CPU占用率【华为云技术分享】

    1.Linux 环境下查看 CPU 信息 1.1.查看 CPU 详细信息 通过 cat /proc/cpuinfo 命令,可以查看 CPU 相关的信息: [root@rh ~]$ cat /proc/ ...

  6. Docker 快速安装&搭建 Mysql 环境

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  7. iOS 报错信息: dyld: Library not loaded: @rpath/XCTest.framework/XCTest Referenced from

    新建项目,引入framework,运行时出现警告:dyld: Library not loaded: @rpath/RLLibrary.framework/RLLibrary  Referenced ...

  8. Linux自有服务(1)-Linux从入门到精通第五天(非原创)

    文章大纲 一.运行模式二.用户与用户组管理(重点)三.网络设置四.ssh服务(重点)五.学习资料下载六.参考文章   自有服务,即不需要用户独立去安装的软件的服务,而是当系统安装好之后就可以直接使用的 ...

  9. MySQL读写分离之Proxy

    MySQL Proxy: ======================================================== MySQL_Proxy Master Slave1 Slav ...

  10. centos7.2下安装python3.6.5

    yum groupinstall 'Development Tools' 出现错误 系统 centos 7.3 使用命令 yum groupinstall 'Development Tools' 出现 ...