文件名: fusion

题目类型: 传统题

时间限制: 3秒

内存限制: 256MB

编译优化:

题目描述

知名科学家小A在2118年在计算机上实现了模拟聚变的过程。

我们将她研究的过程简化。

核子共有26种,可以用a到z共26个字母表示。

核子聚变的过程可以用一个字符串描述。

按照顺序从左到右的顺序,假如有两个相同核子相邻,两个核子就会相互吸引发生聚变生成一个序号+1的核子,特殊的,两个z核子相邻会湮灭没有新的核子生成。

每当两个核子聚变时,就需要重新从左到右重复找到两个相邻的相同核子直到不存在为止。

比如zyzzy->zyy->zz->

小A为了做出足够有效的实验,每次会从一个字符串中选定一个子串操作。

她想要知道每次实验这个子串中的核子能否最终全部湮灭。

输入格式

第一行一个只有小写字母的字符串。

第二行一个数\(n\)表示询问次数

接下来\(n\)行每行两个正整数\(l_{i},r_{i}\)表示询问区间

输出格式

对每次询问输出一行Yes或No表示答案

样例输入

yzyyyzyzyyyz

8

1 6

7 12

1 12

6 11

1 1

1 3

4 9

3 8

样例输出

Yes

Yes

Yes

Yes

No

No

No

No

数据规模与约定

L表示字符串长度

对于30%的数据满足L<=100

对于60%的数据满足L<=3000,n<=3000

另存在20%数据满足字符串中只存在y,z

对于100%的数据,L<=500000,n<=1000000

题解

开始没看到“从左往右”,还以为是线段树维护分治……

\(nL\)大力60。

我们发现对于一段合法串,我们可以把它分成多个(或一个)连续的合法字串。

比如:

zyyzyyyyz

我们可以分成:

zyy | zyy | yyz

这三段都是合法的,所以原串也是合法的。

又比如说:

zyyyyzyz

我们把它分成:

zyy | yyz | yz

显然,yz是不合法的,所以原串是不合法的。

于是我们检验时,我们可以让指针跳着走:

zyy | yyz | yz
^
zyy | yyz | yz
---->^
zyy | yzz | yz
---->^
zyy | yzz | yz
---->^

发现指针跳到外面去了,所以说是不合法的。

不难想到用一个nxt数组表示以第i个开始的最短合法串末尾的下一个位置(感觉很像kmp)。

那么怎么求nxt呢?

我们需要引入一个to数组。

to[i][j]表示从第i位开始最短能拼成j字符的位置的下一个位置(\(j = 0\sim 26\),\(0\)表示\(a\),\(26\)表示没有)。

不难发现to[i][j] = to[to[i][j-1]][j-1]nxt[i] = to[i][26]

当然,开始时tonxt都指向结尾的后面。

然而我们发现这样做会被hack:

xzzxyz

这是因为对于第一个z来讲它只更新了\(25\sim 26\)的情况,所以第一个第一个xnxt会指向末尾。

所以我们需要排除中间这段zz的干扰。

于是我们又想到转移方程:to[i][j] = to[nxt[i]][j]

这样就大功告成了。

然而这样做很容易被卡掉,比如说全是z的情况,往后跳的速度会很慢。

所以我们选择倍增。

下面是代码:

#include <cstdio>
#include <cstring> const int maxn = 500005; char aa[maxn];
int nxt[maxn][21];
int to[maxn][26]; inline void pre()
{
int len = strlen(aa);
for(int i = 0; i < len; ++i)
aa[i] -= 'a';
for(int i = 0; i < len + 3; ++i)
{
for(int j = 0; j <= 20; ++j)
nxt[i][j] = len + 1;
for(int j = 0; j <= 26; ++j)
to[i][j] = len + 1;
}
for(int i = len - 1; i >= 0; --i)
{
to[i][(int)aa[i]] = i + 1;
for(int j = aa[i] + 1; j <= 26; ++j)
to[i][j] = to[to[i][j-1]][j-1];
nxt[i][0] = to[i][26];
for(int j = 1; j <= 20; ++j)
nxt[i][j] = nxt[nxt[i][j-1]][j-1];
for(int j = 0; j < 26; ++j)
if(to[i][j] == len + 1)
to[i][j] = to[nxt[i][0]][j];
}
} inline bool pan(int l, int r)
{
l--;
r--; // 从0开始……(感觉自己好作死)
for(int i = 20; i >= 0; --i)
{
if(nxt[l][i] <= r + 1)
l = nxt[l][i];
if(l == r + 1)
return true;
}
return false;
} int main()
{
freopen("fusion.in", "r", stdin);
freopen("fusion.out", "w", stdout);
gets(aa);
pre();
int n;
scanf("%d", &n);
while(n--)
{
int l, r;
scanf("%d%d", &l, &r);
puts(pan(l, r) ? "Yes" : "No");
}
fclose(stdin);
fclose(stdout);
return 0;
}

20180711模拟赛T3——聚变的更多相关文章

  1. 体育成绩统计——20180801模拟赛T3

    体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...

  2. 20180520模拟赛T3——chess

    [问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\) ...

  3. 20161005 NOIP 模拟赛 T3 解题报告

    subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...

  4. ztz11的noip模拟赛T3:评分系统

    代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  5. 4.26 省选模拟赛 T3 状压dp 差分求答案

    LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...

  6. NOIP欢乐模拟赛 T3 解题报告

    3.小澳的葫芦 (calabash.cpp/c/pas) [题目描述] 小澳最喜欢的歌曲就是<葫芦娃>. 一日表演唱歌,他尽了洪荒之力,唱响心中圣歌. 随之,小澳进入了葫芦世界. 葫芦世界 ...

  7. 字符串模拟赛T3

    只看我的做法就够了 #include<iostream> #include<cstdio> #include<string> #include<cstring ...

  8. 神奇的NOIP模拟赛 T3 LGTB 玩THD

    LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...

  9. [模拟赛] T3 Exploit

    Description 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"EX"为开头的英语单词. eXplore(探索) eXpand(拓张与发展 ...

随机推荐

  1. MongoDB Shell基本操作(五)

    官网文档:https://docs.mongodb.com/ 1. 创建数据库 #如果数据库不存在,则创建数据库,否则切换到指定数据库 use DATABASE_NAME 示例: use runoob ...

  2. 【BZOJ4518】[SDOI2016] 征途(重拾斜率优化DP)

    点此看题面 大致题意: 让你把一个长度为\(n\)的序列划分成\(m\)块,求每块数总和的最小方差乘\(m^2\)的值. 转化方差 首先方差显然是一个比较复杂的东西,需要进行一定转化. 设\(p_i\ ...

  3. 阿里Sentinel支持Spring Cloud Gateway啦

    1. 前言 4月25号,Sentinel 1.6.0 正式发布,带来 Spring Cloud Gateway 支持.控制台登录功能.改进的热点限流和注解 fallback 等多项新特性,该出手时就出 ...

  4. 在macOS苹果电脑上安装Azure DevOps Server(TFS)代理

    1. 概述 MacOS是一套运行于苹果Macintosh系列电脑上的操作系统,是首个在商用领域成功的图形用户界面操作系统.Iphone应用软件的开发人员,都使用运行macOS的电脑或mini盒子进行软 ...

  5. JAVA 运行springboot jar包设置classpath

    Java 命令行提供了如何扩展bootStrap 级别class的简单方法. -Xbootclasspath: 完全取代基本核心的Java class 搜索路径.不常用,否则要重新写所有Java 核心 ...

  6. java jdb

    https://stackoverflow.com/questions/8155253/how-do-i-compile-in-debug-mode-netbeans-java-maven <p ...

  7. 解决java,C#,php,python MD5加密不一致问题

    JAVA写法 public static String md5Base64(final String str, final String key) throws Exception { if ((nu ...

  8. python 统计使用技巧

    python 统计使用技巧 # 1.不输入回车获取值 注:需要tty模块配合. fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) ...

  9. 【UOJ#308】【UNR#2】UOJ拯救计划

    [UOJ#308][UNR#2]UOJ拯救计划 题面 UOJ 题解 如果模数很奇怪,我们可以插值一下,设\(f[i]\)表示用了\(i\)种颜色的方案数. 然而模\(6\)这个东西很有意思,\(6=2 ...

  10. Java自学-集合框架 Collection

    Java集合框架 Collection Collection是一个接口 步骤 1 : Collection Collection是 Set List Queue和 Deque的接口 Queue: 先进 ...