codeforces 264D Colorful Stones
题目
题目来自于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的更多相关文章
- Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学
https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...
- 洛谷CF264D Colorful Stones(子序列匹配,思维)
洛谷题目传送门 神仙思维题. 对于两个字符串的匹配问题,似乎之前蒟蒻写的HAOI2010最长公共子序列题解中提到的建网格图模型是一种套路? 给一个稍微强一点的样例(把字母换成了ABC) AABCB B ...
- Codeforces.1110E.Magic Stones(思路 差分)
题目链接 听dalao说很nb,做做看(然而不小心知道题解了). \(Description\) 给定长为\(n\)的序列\(A_i\)和\(B_i\).你可以进行任意多次操作,每次操作任选一个\(i ...
- CodeForces 909D Colorful Points
题解: 暴力,模拟. 把字符串压缩一下,相同的处理成一位,记录下个数,然后暴力模拟即可. #include <bits/stdc++.h> using namespace std; con ...
- CodeForces - 965D Single-use Stones
题面在这里! 如果你强行把问题建模,可以发现这是一个裸的增广路,又因为这是区间连边,所以跑一个 点数O(N)边数O(N log N)的线段树优化建边的网络流即可,不知道能不能过23333 但其实这个问 ...
- CF264D - Colorful Stones 题解
题面 官方题解 模拟赛题解 题解概述: 定义符号A~B表示序列A是序列B的子序列,A!~B反之. 设操作序列为I,则有A~I,B!~I,C~I,D!~I. 可得出条件①B!~C且D!~A,所以我们只要 ...
- Codeforces Round #162 (Div. 2)
A. Colorful Stones (Simplified Edition) 模拟. B. Roadside Trees (Simplified Edition) 每次转移时,只需要爬到\(min( ...
- Codeforces Round #162 (Div. 2) A~D 题解
A. Colorful Stones (Simplified Edition) time limit per test 2 seconds memory limit per test 256 mega ...
- 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个石头) ...
随机推荐
- js 特效 手风琴效果
$(document).ready(function(){ //定义展开的块 var lastBlock = $('#a1'); //展开的块的宽度 var maxWidth = 406; //折叠的 ...
- 我常用的iphone开发学习网站[原创]
引用地址:http://www.cnblogs.com/fuleying/archive/2011/08/13/2137032.html Google 翻译 Box2d 托德的Box2D的教程! Bo ...
- Week 5a - Mouse input and more lists ----mouse input
<span style="font-size:14px;">import simplegui import math # global variables ball_p ...
- 谈谈我的iOS学习及分享
iOS可以说是最近几年比较热门和高速发展一个系统,因此iOS开发也变得火热.越来越多的程序员都转向了iOS开发,每个人的学习方法都不同,分享下我的学习经历和见解吧.我之前学习过C++和Qt,Java也 ...
- 链接分析算法之:HillTop算法
链接分析算法之:HillTop算法 Hilltop算法是由Krishna Baharat 在2000年左右研究的,于2001年申请专利,但是有很多人以为Hilltop算法是由谷歌研究的.只 ...
- Uva 12569 Planning mobile robot on Tree (EASY Version)
基本思路就是Bfs: 本题的一个关键就是如何判段状态重复. 1.如果将状态用一个int型数组表示,即假设为int state[17],state[0]代表机器人的位置,从1到M从小到大表示障碍物的位置 ...
- Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象,
Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象, 一.类 在ios中,类的声明和实现时分离的,也就是说不能写在同一个文件中,声明放在 .h文件中,实现放在 .m 文 ...
- iOS网络之数据请求GET和POST
1. HTTP和HTTPS协议 1> URL URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位 ...
- Android Testing(1) 浅尝Android测试的奥秘
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 仅供学习和交流使用,翻译不好勿喷,请只摘除不合适的地方 Testing The Android fram ...
- [计算机网络] vsftpd的安装与使用
简单介绍: vsftpd是一个能够执行在类UNIX操作系统上的FTPserver软件,它能够执行在Linux.BSD.Solaris.HP-UX等系统上. 1 vsftpd的安装 在ubuntu系统上 ...