题目

题目来自于rng_58Orz。

算法

讨论某个状态\((x,y)\)是否可达,\(x\)是狐狸到达的石头,\(y\)是猫的。

题解说,如果满足以下条件,那么它就是可到达状态:

  • \(t[0..y]\)不是\(s[0..x-1]\)的子串。
  • \(s[0..x]\)不是\(t[0..y-1]\)的字串。
  • \(s\)和\(t\)串的形式不能是这样的:\(s=......ab,t=......ba\)。

第三个条件很容易忽略!

建议多看几次rng_58的题解,我觉得题解思考的方式很新奇Orz:

  • 考虑非常显然的必要条件
  • 考虑如何通过必要条件来构造一个合法的序列
  • 发现途中有必要条件忽略的情况!
  • 完善条件,然后得出必要充分条件

代码

通过上面的分析,我们就可以乱搞了:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long i64; template <class T>
void tension(T &a, const T &b) {
if (b < a) a = b;
} const int MAXN = (int) 1e6 + 3; int n, m;
char s[MAXN], t[MAXN]; void init(char* const s, int n, char* const t, int m, int* const ret) {
for (int i = 1; i <= n; i ++) {
ret[i] = ret[i - 1] + 1;
while (ret[i] < m && t[ret[i]] != s[i])
ret[i] ++;
tension(ret[i], m);
}
} int main() {
scanf("%s\n%s\n", s + 1, t + 1);
static int p1[MAXN], p2[MAXN];
n = strlen(s + 1);
m = strlen(t + 1);
init(s, n, t, m, p1);
init(t, m, s, n, p2); #define hash(x) (x == 'R' ? 0 : (x == 'G' ? 1 : 2))
static int sum[MAXN][3][3];
for (int i = 2; i <= m; i ++) {
for (int j = 0; j < 3; j ++)
for (int k = 0; k < 3; k ++) {
if (hash(t[i - 1]) == j && hash(t[i]) == k)
sum[i][j][k] = sum[i - 1][j][k] + 1;
else
sum[i][j][k] = sum[i - 1][j][k];
}
} i64 ans = 0;
int L = 1;
for (int i = 1; i <= n; i ++) {
int R = p1[i];
while (L <= m && p2[L] < i) L ++;
ans += max(R - L + 1, 0);
if (L <= R && i > 1) {
int j = hash(s[i - 1]);
int k = hash(s[i]);
if (j != k) {
ans -= sum[R][k][j];
ans += sum[L - 1][k][j];
}
}
} cout << ans << endl; return 0;
}

codeforces 264D Colorful Stones的更多相关文章

  1. Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学

    https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...

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

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

  3. Codeforces.1110E.Magic Stones(思路 差分)

    题目链接 听dalao说很nb,做做看(然而不小心知道题解了). \(Description\) 给定长为\(n\)的序列\(A_i\)和\(B_i\).你可以进行任意多次操作,每次操作任选一个\(i ...

  4. CodeForces 909D Colorful Points

    题解: 暴力,模拟. 把字符串压缩一下,相同的处理成一位,记录下个数,然后暴力模拟即可. #include <bits/stdc++.h> using namespace std; con ...

  5. CodeForces - 965D Single-use Stones

    题面在这里! 如果你强行把问题建模,可以发现这是一个裸的增广路,又因为这是区间连边,所以跑一个 点数O(N)边数O(N log N)的线段树优化建边的网络流即可,不知道能不能过23333 但其实这个问 ...

  6. CF264D - Colorful Stones 题解

    题面 官方题解 模拟赛题解 题解概述: 定义符号A~B表示序列A是序列B的子序列,A!~B反之. 设操作序列为I,则有A~I,B!~I,C~I,D!~I. 可得出条件①B!~C且D!~A,所以我们只要 ...

  7. Codeforces Round #162 (Div. 2)

    A. Colorful Stones (Simplified Edition) 模拟. B. Roadside Trees (Simplified Edition) 每次转移时,只需要爬到\(min( ...

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

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

  9. HDOJ 4248 A Famous Stone Collector DP

    DP: dp[i][j]前i堆放j序列长度有多少行法, dp[i][j]=dp[i-1][j] (不用第i堆), dp[i][j]+=dp[i-1][j-k]*C[j][k] (用第i堆的k个石头) ...

随机推荐

  1. Tableau 群集部署

    由于公司连续两个月月底Tableau服务器过载崩溃,因此有了搭建Tableau服务器群集的想法.目前还在测试阶段,所以做一步写一步了. 目录: 一.安装和配置工作服务器 二.其他参考文档 一. 安装和 ...

  2. java源代码如何打成jar包

    链接地址:http://jingyan.baidu.com/article/046a7b3ed8b23ef9c27fa9b9.html 有时自已写了一个很巧妙的方法,想分享给别人用,这时我们就可以将其 ...

  3. 【Linux命令】查找命令

    如果你想在当前目录下 查找"hello,world!"字符串,可以这样: grep -rn "hello,world!" *

  4. Oracle/Mysql批量插入的sql,效率比较高

    1.oracle 批量插入: insert into tableName(col1,col2,col3...)    select 1,'第一行第一列值','第二列值' from dual union ...

  5. zookeeper 安装

    Zookeeper安装 一.   下载zookeeper http://www.apache.org/dist/zookeeper/stable/ 二.   解压zookeeper.tar >& ...

  6. mongoDB初接触

    首先去官网http://www.mongodb.org/ 下载mongoDB 下载后解压D:\mongodb 创建两个新文件夹data以及log 新建一个文件命名为mongodb.cfg dbpath ...

  7. mysql ifnull if

    IFNULL(expr1,expr2) 如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2.IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境. mysq ...

  8. MyEclipse2014不支持jre1.8吗

    myeclipse 2015才支持了java 8 也可以用Eclipse Kepler加插件的形式来支持java 8

  9. mybatis通用DAO

    扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. 回复:茶爸爸了解他这个人!! 花了几天的时间研究了一下mybatis的源代码,觉得这 ...

  10. kinect for windows - DepthBasics-D2D详解之二

    通过上篇文章,我们了解了在视频图像从kinect开发包传输到应用程序之前的一系列初始化工作,那么这篇文章主要来叙述,如何将一帧图像数据获取到,并显示出来的. 更新窗口是在Run函数消息处理中,当Kin ...