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个石头) ...
随机推荐
- 【前端】使用weinre对手机、微信浏览器页面调试
官方网站:http://people.apache.org/~pmuellr/weinre-docs/latest/ windows下安装以及使用: 1.安装nodejs 下载nodejs引擎,32b ...
- gets scanf以及缓冲区域的问题
1:scanf scanf会忽略开头所有的空格,并以Space Enter Tab 结束输入, 不会舍弃最后的回车符(即回车符会残存在缓冲区域中) 2:getchar getchar以Enter结束, ...
- linux kernel中timer的使用
linux kernel中timer的使用 http://blog.csdn.net/njuitjf/article/details/16888821 在kernel中如果想周期性的干些什么事情,或者 ...
- 菜鸟初识UML
首当其冲的就是:什么是UML呢? 首先,UML 是一种可视化的面向对象的建模语言.它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造 ...
- 快速提取PROTEL99SE PCB文件上的封装方法
1.首先打开你要提取元件封装的PCB. 2.执行生成元件库的命令...软件会帮你把这个PCB上的所有元件生成一个临时库. 3.打开你自己的元件库... 4.PCB刚才生成的元件库中选中你所需要的元件, ...
- QT VS检测内存泄漏
测试程序:http://download.csdn.net/detail/ajaxhe/4085447 vld-2.2.3: http://vld.codeplex.com/releases/view ...
- (step8.2.4)hdu 1846(Brave Game——巴什博奕)
题目大意:输入一个整数t,表示测试用例是.接着输入2个整数n,m.分别表示这堆石头中石头的个数,和每次所能取得最大的石头数.判断那一方为赢家 解题思路: 1)这是一道简单的巴什博弈: 所谓巴什博弈,是 ...
- Fedora 启动 SSH服务
一.Fedora 启动sshd服务: 1.先确认是否已安装ssh服务: [root@localhost ~]# rpm -qa | grep openssh-server openssh-server ...
- Oracle笔记之对象权限与系统权限总结
对象权限与系统权限 创建表和创建session是系统权限: 系统管理员是有权限去訪问其它表的 以sys登录 sqlplus sys/on_change_install as sysdba; 创 ...
- hdu4597 Play Game
Play Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Sub ...