ZOJ 4010 Neighboring Characters(ZOJ Monthly, March 2018 Problem G,字符串匹配)
题目链接 ZOJ Monthly, March 2018 Problem G
题意 给定一个字符串。现在求一个下标范围$[0, n - 1]$的$01$序列$f$。$f[x] = 1$表示存在一种方案,删掉原字符串中的连续$x$个字母,
使得剩下的字符串中任意相邻的两个字母都不同。在这道题中所有的字符串首尾字符看做是相邻的。
对于每个起始位置求出最多往右延伸到的位置,满足该区间代表的字符串是一个满足任意相邻字母不同的字符串。
首先考虑一个连续的满足任意相邻字母不同的字符串。设其长度为$l$
$i$从$1$枚举到$l$,判断能否删掉连续$n - i$个字母(剩下$i$个字母)满足题意。(对当前字符串来说$i > l$显然无法满足)
对于任意的一种删掉连续$n - i$个字母的方案,剩下的$i$个字母组成的字符串已经满足了任意相邻两个字母不同,
但是还不一定不满足首尾字母不同。
所以如果满足以下任意一个条件
$s[1]$ $\neq$ $s[i]$
$s[2]$ $\neq$ $s[i+1]$
$s[3]$ $\neq$ $s[i+2]$
...
$s[l-i+1]$ $\neq$ $s[l]$
其实这个东西等价于$s[1..l-i+1]$ $\neq$ $s[i..l]$,那么直接用字符串hash判断即可。
时间复杂度$O(n)$
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef unsigned long long LL; const int N = 2e6 + 10;
const LL base = 20123; int T;
int n, m;
int ans[N];
char s[N];
LL bin[N], h[N];
LL seed = 1; inline LL gethash(int l, int r){ return h[r] - h[l - 1] * bin[r - l + 1]; } int main(){ bin[0] = 1;
rep(i, 1, 2e6 + 1) bin[i] = bin[i - 1] * base; scanf("%d", &T);
while (T--){
scanf("%s", s + 1);
n = strlen(s + 1);
m = 2 * n - 1; rep(i, 1, n - 1) s[i + n] = s[i];
h[0] = 0; rep(i, 1, m) h[i] = h[i - 1] * base + s[i]; memset(ans, 0, sizeof ans);
for (int i = 1, j; i < m; i = j + 1){
for (j = i; j < m && s[j] != s[j + 1]; ) ++j;
int l = j - i + 1;
rep(k, 2, l){
if (k > n) break;
if (gethash(i, i + l - k) != gethash(j - l + k, j)) ans[n - k] = 1;
}
} rep(i, 0, n - 2) putchar(ans[i] + 48); putchar(49);
putchar(10);
}
return 0;
}
ZOJ 4010 Neighboring Characters(ZOJ Monthly, March 2018 Problem G,字符串匹配)的更多相关文章
- ZOJ 4009 And Another Data Structure Problem(ZOJ Monthly, March 2018 Problem F,发现循环节 + 线段树 + 永久标记)
题目链接 ZOJ Monthly, March 2018 Problem F 题意很明确 这个模数很奇妙,在$[0, mod)$的所有数满足任意一个数立方$48$次对$mod$取模之后会回到本身. ...
- ZOJ Monthly, March 2018 题解
[题目链接] A. ZOJ 4004 - Easy Number Game 首先肯定是选择值最小的 $2*m$ 进行操作,这些数在操作的时候每次取一个最大的和最小的相乘是最优的. #include & ...
- ZOJ Monthly, March 2018 Solution
A - Easy Number Game 水. #include <bits/stdc++.h> using namespace std; #define ll long long #de ...
- ZOJ Monthly, March 2018
A. Easy Number Game 贪心将第$i$小的和第$2m-i+1$小的配对即可. #include<cstdio> #include<algorithm> usin ...
- 【BFS】【最小生成树】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem G. We Need More Managers!
题意:给你n个点,点带权,任意两点之间的边权是它们的点权的异或值中“1”的个数,问你该图的最小生成树. 看似是个完全图,实际上有很多边是废的.类似……卡诺图的思想?从读入的点出发BFS,每次只到改变它 ...
- Windows 10 Version 1803 (Updated March 2018) MSDN 镜像下载
微软已按先前预期于美国时间 2018 年 4 月 30 日正式向所有用户发布了 Windows 10 Version 1803 (Updated March 2018) 的 ISO 镜像下载,按微软官 ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- ZOJ Monthly, January 2018 训练部分解题报告
A是水题,此处略去题解 B - PreSuffix ZOJ - 3995 (fail树+LCA) 给定多个字符串,每次询问查询两个字符串的一个后缀,该后缀必须是所有字符串中某个字符串的前缀,问该后缀最 ...
- ZOJ Monthly, March 2013
A题 题目大意:给出一棵树,一开始节点值均为0,先要求完成在线操作:将某子树所有节点值取反,或者查询某子树总点权. 题解:很基础的线段树题,既然两个操作都是子树操作,那么就先树链剖分一下,将子树操作转 ...
随机推荐
- php设计模式之工厂设计模式
概念: 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式. 好处: PHP中能够创建基于变量内容 ...
- List(JDK1.7)(3)
Vector 实现了一个存储对象的增长数组.如同一个数组,它可以使用一个整型下标来访问元素.但是,vector的大小是可以根据需要增长或收缩的. 每个vector通过维护capacity和capaci ...
- 在传统的ADO.NET中使用事务
using (SqlConnection conn = new SqlConnection()) { SqlCommand cmd = conn.CreateCommand(); //启动事务 Sql ...
- Spring MVC表单防重复提交
利用Spring MVC的过滤器及token传递验证来实现表单防重复提交. 创建注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RU ...
- c++ STL 常用容器元素类型相关限制 指针 引用
c++ 的 STL 中主要有 vector , list, map, set , multimap,multiset 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...
- linux 配置免密码登陆
在使用scp命令传输的时候需要密码 配置免密码登陆 ssh-keygen -t rsa (四个回车) 执行命令完成后,会生成两个文件id_rsa(私钥).id-rsa.pub(公钥) 将公钥拷贝到要免 ...
- 【codeforces】【比赛题解】#849 CF Round #431 (Div.2)
cf的比赛越来越有难度了……至少我做起来是这样. 先看看题目吧:点我. 这次比赛是北京时间21:35开始的,算是比较良心. [A]奇数与结束 "奇数从哪里开始,又在哪里结束?梦想从何处起航, ...
- python(32):多进程(2) multiprocessing
python 多线程:多线程 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心. Python提供了非常好用的多进程包multiprocessing,你只需要 ...
- C 之回调函数
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用:回调是一种双向调用模式,也就是 ...
- 007_苹果Mac系统锁屏不待机效果设置方法介绍
Mac如何设置锁屏不断网?Mac如何设置锁屏不待机?这是一个非常麻烦的设置,有时候一锁屏幕电脑就跟着待机了,这非常的麻烦,所以今天小编就用图文教程的方式教大家Mac如何设置锁屏不断网Mac如何设置锁屏 ...