CF-1291 D - Irreducible Anagrams
D. Irreducible Anagrams
题意
若两个字符串中每个字符的个数都是一样的,则称他们互为\(anagrams\)。现在定义两个字符串s,t是\(reducible~anagram\)的,必须满足下面的条件:
- 将s、t两个字符串分别拆成k(k>=2)个连续子串
- \(s_1,s_2\cdots s_k\) 按顺序排列构成s
- \(t_1,t_2\cdots t_k\) 按顺序排列构成t
- \(\forall i \in [1,k],都有s_i 是 t_i 的anagrams\)
现在给了一个字符串,每次询问它的一个字串是否存在一个\(irreducible~anagram\)(请注意这些概念必须是以s是t的\(anagrams\)前提下进行的)
分析
对于每个询问的字符串s,是否存在一个字符串t,使得t是s的\(irreducible~anagram\).分析题目条件可以将问题转换为:在t和s的任意等长前缀中,它们的字符集的个数必须是不同的(也就是确保它们不是\(anagrams\))
我们声明满足下面条件的字符串存在\(irreducible~anagram\)
- 长度等于1
- 首字符和尾字符不同
- 字符串包含至少三种不同的字符
求证这些条件后,利用前缀和的技巧可以很容易的解决本题。下面试证一下:
- 长度等于1,那么就无法找到一个 k(k>=2) ,所以它的\(irreducible~anagram\)就是它本身
- \(s[1] \neq s[n]\) 即首字符和尾字符不同,我们可以尽量靠前的将所有同\(s[n]\)一样的字符写在前面。然后剩下的字符随便放置即可。可以想到对于任意的\(k\in[1,n-1]\),都满足\(s[1..k]\)与\(t[1..k]\)的字符集不同。
- 字符串包含至少三种不同的字符,并且\(s[1] = s[n]\)。可以找到一个最大的\(j\)满足\(s[j]\neq s[n]\)。可以把所以同\(s[j]\)一样的字符放到最前面,然后紧挨着中间放置所有同\(s[n]\)的字符,因为不同字符个数大于等于3,所以现在最后面肯定还有空位,将剩余的字符随意放置在最后面即可。可以想到构成的这样的一个串,一定满足任意前缀字符集不等。
到此为止就可以放心做题了,但试图证明一下为何\(s[1] = s[n]~~and~~不同字符个数等于2\)的情况为何找不到。
假设字符只有a和b两种,而且\(s[1]=s[n]=a\),那么我们构造出来的串必须满足任意前缀中\(b\)的个数,都大于\(s\)对应前缀中b的个数。那么考虑\(s\)中最后出现\(b\)的位置\(x\),可以想到\(s[1..x-1]\)前缀比\(t[1..x-1]\)少一个\(b\),而\(s[x]=b\)得出现使得\(t[x]\)必须再放置一个\(b\),这样才能满足任意前缀中b得个数都要比s多,但此时已经没有\(b\)可以放了(因为\(s[1..x-1]\)就已经多放了一个b)所以在\(x\)这个位置,无法构造。
const int N = 200010 + 5;
char s[N];
int n, sum[N][26], q, l, r, cnt[26];
int main() {
scanf("%s", s+1);
n = strlen(s + 1);
for (int i = 1; i <= n;i++){
memcpy(sum[i], sum[i - 1], sizeof sum[i]);
sum[i][s[i] - 'a']++;
}
scanf("%d", &q);
while(q--){
scanf("%d%d", &l, &r);
if(r - l == 0){
puts("YES");
continue;
}
int x = 0;
for (int i = 0; i < 26;i++){
cnt[i] = sum[r][i] - sum[l - 1][i];
if(cnt[i])
x++;
}
if(s[l] == s[r] && x <= 2){
puts("NO");
}else
puts("YES");
}
return 0;
}
CF-1291 D - Irreducible Anagrams的更多相关文章
- B. Irreducible Anagrams【CF 1290B】
思路: 设tx为t类别字符的个数. ①对于长度小于2的t明显是"YES"②对于字符类别只有1个的t明显是"YES"③对于字符类别有2个的t,如左上图:如果str ...
- Codeforces 1290B/1291D - Irreducible Anagrams
题目大意: 两串字符串 s 和 t 是否 anagrams(下文简称ANA) 的定义是: 是否能将 s 内的字母打乱顺序后再拼接得到 t 我们考虑互相ANA的两串字符串 s 和 t 我们称 t 是 s ...
- cf D. Sereja ans Anagrams
http://codeforces.com/contest/368/problem/D #include <cstdio> #include <cstring> #includ ...
- 【题解】CF1290B Irreducible Anagrams
Link 题目大意:对于一个字符串,每次询问一个区间,看看这个区间是不是可以划分为若干区间,这些区间内数字经过排列后可以还原原来区间. \(\text{Solution:}\) 菜鸡笔者字符串构造该好 ...
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
- CF 题目选做
写省选的题目对noip没什么大用 关键是 细节题或者是思考题比较重要 练思维自然是CF比较好了 把我见到的比较好的CF题放上来刷一刷. LINK:Complete the projects 就是说一个 ...
- C语言 · Anagrams问题
问题描述 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,"Unclear"和"Nuclear ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- [LeetCode] Find All Anagrams in a String 找出字符串中所有的变位词
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings ...
随机推荐
- 2021.Jan.11.Mon
人生中的机会不会有很多次,把每一次机会都当作最后一次机会,全力以赴地去做好,那么,你就不会永远在等待下一个机会. 看书心得---------By VincentAdamNemessis ...
- Java实现RS485串口通信
前言 前段时间赶项目的过程中,遇到一个调用RS485串口通信的需求,赶完项目因为楼主处理私事,没来得及完成文章的更新,现在终于可以整理一下当时的demo,记录下来. 首先说一下大概需求:这个项目是机器 ...
- maven 无法导入ojdbc 的jar包 解决方法
由于maven无法在线安装ojdbc包,所有先在我们需要手动导入. 准备环境: 1.系统需要配置好jdk以及maven环境. 2.ojdbc的jar包,记住jar的路径,我的路径是:E:\jdbc\o ...
- Typora笔记上传到播客时图片不显示问题解决(已解决)
前言: 相信我们都遇到过,使用Typora做笔记是一件非常令人舒服的事,然而,它却有一个非常难受的地方,那就是我们在做完笔记想要将其上传到自己的博客时,复制粘贴的图片无法显示.因为Typora复制 ...
- Linux tar压缩和解压
经常会忘记 tar 压缩和解压命令的使用,故记下来. 1. 打包压缩 tar -zcvf pack.tar.gz pack/ #打包压缩为一个.gz格式的压缩包 tar -jcvf pack.tar. ...
- SpringBoot Logback无法获取配置中心属性
SpringBoot Logback无法获取配置中心属性 前言 最近在做项目中,需要把项目中的日志信息通过RabbitMQ将规定格式的消息发送到消息队列中,然后ELK系统通过消息队列拿日志并且保存起来 ...
- 优先队列priority_queue排序
优先队列默认大顶堆,即堆顶元素是最大值 改成小顶堆时: priority_queue<int,vector<int>, greater<int> > Q;//注意最 ...
- 环境变量IFS
环境变量IFS的值是由1个空格.1个制表符.1个换行符依序构成的字符串,也就是" \t\n"字符串. #查看IFS变量值的长度: test ~ # expr length &quo ...
- oracle分区表分区栏位NULL值测试
实验在分区栏位为NULL时,分区表的反应 1.创建普通的分区表 CREATE TABLE MONKEY.TEST_PART_NULL_NORMAL ( ID NUMBER, ADD_DATE DATE ...
- Core3.1 微信v3 JSAPI支付
1.前言 "小魏呀,这个微信支付还要多久?","快了快了老板,就等着最后一步了...","搞快点哈,就等着上线呢","...... ...