题目描述

$Cab$有两行石子,每个石子上有一个字母,为$'C''A''B'$中的一个。
一开始,在每行第一个石子上站着一只$lucky$,$Cab$每次可以选择一个字母,使得所站石子上字母为该字母的$lucky$向前走一步,如果此时$lucky$已经到了一行石子的结尾就会掉出去,$Cab$显然不会这么做。
一个数对$(x,y)$是$lucky$的,当且仅当在$lucky$不掉出去的前提下,通过一些操作能使第一行的$lucky$处于第$x$个石子的同时第二只$lucky$处于第$y$个石子。
请求出有多少个$lucky$的数对。


输入格式

第一行一个长度为$n$的字符串表示第一行石子。
第二行一个长度为$m$的字符串表示第二行石子。


输出格式

输出一个答案表示$lucky$的数对个数。


样例

样例输入:

CAB
ABCAB

样例输出:

11


数据范围与提示

对于$30\%$的数据:$n\leqslant 1,000,m\leqslant 1,000$。
对于另$30\%$的数据:$n\leqslant 50,000,m\leqslant 50,000$,且两个字符串中只含有两种字母。
对于$100\%$的数据:$n\leqslant 1,000,000,m\leqslant 1,000,000$。


题解

官方题解画了一堆图,我也没看懂。

对于第一个串中的每一个点,其有一个覆盖范围$(l,r)$,可以用贪心的思想,$l$即为尽可能让其不动;$r$则为尽可能让它动;注意边界即可。

但是打个表会发现,这中间有一些点还是不能取到;再认真看一下,会发现对于当前点$a_i$,如果$a_i=b_j$且$a_{i-1}=b_{j+1}$,那么这个$(i,j)$是不可取的。

那么答案就是:

$$ans=\sum \limits_{i=1}^n r_i-l_i+1-num[i]$$

上式中的$num[i]$即为$l_i\sim r_i$中$a_i=b_j$且$a_{i-1}=b_{j+1}$的个数。

$num$数组可以用桶$+$前缀和$+$差分处理。

如果你发现$WA90$的话可以考虑将两个串的读入顺序交换即可。

时间复杂度:$\Theta(n+m)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int a[1000001],b[1000001],la,lb;
char ch1[1000001],ch2[1000001];
int l[1000001],r[1000001];
int t[1000001][6];
long long ans;
int main()
{
scanf("%s%s",ch1+1,ch2+1);
la=strlen(ch2+1);
lb=strlen(ch1+1);
for(int i=1;i<=la;i++)
a[i]=ch2[i]-'A'+1;
for(int i=1;i<=lb;i++)
b[i]=ch1[i]-'A'+1;
int faill=1,failr=1;
for(int i=1;i<=la;i++)
{
while(a[i]!=b[failr]&&failr<lb)failr++;
l[i]=faill;r[i]=failr;
if(a[i]==b[faill]&&faill<lb)faill++;
if(failr<lb)failr++;
}
for(int i=2;i<=lb;i++)
{
if(b[i-1]==1&&b[i]==2)t[i][0]++;
if(b[i-1]==2&&b[i]==1)t[i][1]++;
if(b[i-1]==1&&b[i]==3)t[i][2]++;
if(b[i-1]==3&&b[i]==1)t[i][3]++;
if(b[i-1]==2&&b[i]==3)t[i][4]++;
if(b[i-1]==3&&b[i]==2)t[i][5]++;
t[i][0]+=t[i-1][0];
t[i][1]+=t[i-1][1];
t[i][2]+=t[i-1][2];
t[i][3]+=t[i-1][3];
t[i][4]+=t[i-1][4];
t[i][5]+=t[i-1][5];
}
ans=r[1]-l[1]+1;
for(int i=2;i<=la;i++)
{
ans+=r[i]-l[i]+1;
if(a[i]==a[i-1])continue;
if(a[i]==1&&a[i-1]==2)ans-=t[r[i]][0]-t[l[i]-1][0];
if(a[i]==2&&a[i-1]==1)ans-=t[r[i]][1]-t[l[i]-1][1];
if(a[i]==1&&a[i-1]==3)ans-=t[r[i]][2]-t[l[i]-1][2];
if(a[i]==3&&a[i-1]==1)ans-=t[r[i]][3]-t[l[i]-1][3];
if(a[i]==2&&a[i-1]==3)ans-=t[r[i]][4]-t[l[i]-1][4];
if(a[i]==3&&a[i-1]==2)ans-=t[r[i]][5]-t[l[i]-1][5];
}
printf("%lld",ans);
return 0;
}

rp++

[CSP-S模拟测试]:stone(结论+桶+前缀和+差分)的更多相关文章

  1. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛. A.Easy Equation (前缀和/差分)

    题意:RT,给你四个数\(a,b,c,d\),求\(x+y+z=k\)的方案数. 题解:我们可以先枚举\(x\)的值,然后\(x+y\)能取到的范围一定是\([x,x+b]\),也就是说这个区间内每个 ...

  2. [CSP-S模拟测试]:电压机制(图论+树上差分)

    题目描述 科学家在“无限神机”($Infinity\ Machine$)找到一个奇怪的机制,这个机制有$N$个元件,有$M$条电线连接这些元件,所有元件都是连通的.两个元件之间可能有多条电线连接.科学 ...

  3. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  4. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  5. Mock 模拟测试简介及 Mockito 使用入门

    Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...

  6. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  7. csp-s模拟测试93

    csp-s模拟测试93 自闭场. $T1$想到$CDQ$,因为复杂度少看见一个$0$打了半年还用了$sort$直接废掉,$T2$,$T3$直接自闭暴力分都没有.考场太慌了,心态不好. 02:07:34 ...

  8. csp-s模拟测试91

    csp-s模拟测试91 倒悬吃屎的一套题. $T1$认真(?)分析题意发现复杂度不能带$n$(?),计划直接维护答案,考虑操作对答案的影响,未果.突然发现可以动态开点权值线段树打部分分,后来$Tm$一 ...

  9. csp-s模拟测试89

    csp-s模拟测试89 $T1$想了一会儿没什么思路,一看$T2$  $1e18$当场自闭打完暴力就弃了,$T3$看完题感觉要求$lca$和$dep$,手玩了一下样例发现$lca$很显然,$dep$貌 ...

随机推荐

  1. numpy将数组保存为文件

    保存单个数组 np.save和np.load是读写磁盘数组数据的两个主要函数.默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的: 如果文件路径末尾没有扩展名.npy,则该扩展 ...

  2. Luogu P3647 [APIO2014]连珠线

    题目 换根dp. 显然对于给定的一棵有根树,蓝线都不能拐弯. 设\(f_{u,0}\)表示\(u\)不是蓝线中点时子树内的答案,\(f_{u,1}\)表示\(u\)是蓝线中点时子树内的答案.(以\(1 ...

  3. python-event事件-模仿红绿灯

    import time import threading event =threading.Event() def lighter(): count=0 event.set()#先设置成绿灯 whil ...

  4. CDH部署StreamSets

    StreamSets是一个大数据采集工具,数据源支持包括结构化和半/非结构化,目标源支持HDFS,HBase,Hive,Kudu,Cloudera Search, ElasticSearch等.它包括 ...

  5. 在html中展示pdf

    pc端 插件: https://pdfobject.com/ 使用: <!doctype html> <html lang="en"> <head&g ...

  6. 简单了解node stream

    Almost all Node.js applications, no matter how simple, use streams in some manner. 开篇先吓吓自己.画画图,分析分析代 ...

  7. css3 伪类以及伪元素的特效

    菱形          

  8. 进制转换以及byted与str的区别

    二进制与十六进制数之间的转换 https://jingyan.baidu.com/article/47a29f24292608c0142399cb.html byted与str的区别 https:// ...

  9. 一、json数组的键和值

    一.json数组的键和值 https://blog.csdn.net/sinat_30224769/article/details/51702203 string test_json = " ...

  10. 单调队列优化DP || [Poi2014]Little Bird || BZOJ 3831 || Luogu P3572

    题面:[POI2014]PTA-Little Bird 题解: N<=1e6 Q<=25F[i]表示到达第i棵树时需要消耗的最小体力值F[i]=min(F[i],F[j]+(D[j]> ...