D. Irreducible Anagrams

题意

若两个字符串中每个字符的个数都是一样的,则称他们互为\(anagrams\)。现在定义两个字符串s,t是\(reducible~anagram\)的,必须满足下面的条件:

  1. 将s、t两个字符串分别拆成k(k>=2)个连续子串
  2. \(s_1,s_2\cdots s_k\) 按顺序排列构成s
  3. \(t_1,t_2\cdots t_k\) 按顺序排列构成t
  4. \(\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
  2. 首字符和尾字符不同
  3. 字符串包含至少三种不同的字符

求证这些条件后,利用前缀和的技巧可以很容易的解决本题。下面试证一下:

  1. 长度等于1,那么就无法找到一个 k(k>=2) ,所以它的\(irreducible~anagram\)就是它本身
  2. \(s[1] \neq s[n]\) 即首字符和尾字符不同,我们可以尽量靠前的将所有同\(s[n]\)一样的字符写在前面。然后剩下的字符随便放置即可。可以想到对于任意的\(k\in[1,n-1]\),都满足\(s[1..k]\)与\(t[1..k]\)的字符集不同。
  3. 字符串包含至少三种不同的字符,并且\(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的更多相关文章

  1. B. Irreducible Anagrams【CF 1290B】

    思路: 设tx为t类别字符的个数. ①对于长度小于2的t明显是"YES"②对于字符类别只有1个的t明显是"YES"③对于字符类别有2个的t,如左上图:如果str ...

  2. Codeforces 1290B/1291D - Irreducible Anagrams

    题目大意: 两串字符串 s 和 t 是否 anagrams(下文简称ANA) 的定义是: 是否能将 s 内的字母打乱顺序后再拼接得到 t 我们考虑互相ANA的两串字符串 s 和 t 我们称 t 是 s ...

  3. cf D. Sereja ans Anagrams

    http://codeforces.com/contest/368/problem/D #include <cstdio> #include <cstring> #includ ...

  4. 【题解】CF1290B Irreducible Anagrams

    Link 题目大意:对于一个字符串,每次询问一个区间,看看这个区间是不是可以划分为若干区间,这些区间内数字经过排列后可以还原原来区间. \(\text{Solution:}\) 菜鸡笔者字符串构造该好 ...

  5. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  6. CF 题目选做

    写省选的题目对noip没什么大用 关键是 细节题或者是思考题比较重要 练思维自然是CF比较好了 把我见到的比较好的CF题放上来刷一刷. LINK:Complete the projects 就是说一个 ...

  7. C语言 · Anagrams问题

    问题描述 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,"Unclear"和"Nuclear ...

  8. 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 ...

  9. [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 ...

随机推荐

  1. Python requirements.txt 语法

    前言 之前一直苦于一个问题,比如一些包在Win上安装不了,比如 uvloop 但是为了提高效率,代码中必须有这个模块 在运行中可以通过 os 模块判断是否使用, 那依赖文件呢? requirement ...

  2. python virtualenv 基本使用

    下载 pip install virtualenv 校验是否成功 virtualenv --version 使用 创建env环境 要写一个新项目,使用env先创建环境 cd xx\xx\xx\ # 进 ...

  3. win安装python模块出现依赖问题的解决方法 & No module named 'MySqldb'

    前言 一年多了,还在写这种问题,羞愧. 新公司不让用自己的电脑,配的winPC,项目启不起来,之前也出现过这个问题,是py3缺少某个模块,但是自己没记,这次记一下好了. No module named ...

  4. 深入剖析setState同步异步机制

    关于 setState setState 的更新是同步还是异步,一直是人们津津乐道的话题.不过,实际上如果我们需要用到更新后的状态值,并不需要强依赖其同步/异步更新机制.在类组件中,我们可以通过thi ...

  5. Pycharm同时执行多个脚本文件

    Pycharm同时执行多个脚本文件 设置Pycharm使它可以同时执行多个程序 打开Pycharm 找到Run,点击确认 点击Edit Configurations 右上角Allow parallel ...

  6. P1220 关路灯(区间规划)

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  7. CTF实验吧-WEB题目解题笔记(1)简单的登陆题

    1.简单的登陆题 解题链接: http://ctf5.shiyanbar.com/web/jiandan/index.php  Burp抓包解密 乱码,更换思路.尝试id intruder 似乎也没什 ...

  8. dblink查找对应的目标端session

    v$session试图中process字段代表的是客户端所在机器的进程号 例如我使用toad连接数据库,查询到的process即toad的进程号 SELECT process FROM V$SESSI ...

  9. Docker相关简介以及使用方法

    Docker: 可以把它看作是一个软件,在这个软件当中呢,还可以安装其他的软件,还可以把软件所需要的环境依赖一起添加进来,这样让开发人员的程序在不同的环境当中都可以流转起来,避免了程序出现" ...

  10. uni-app开发经验分享十: 封装request请求

    http.js //封装requset,uploadFile和downloadFile请求,新增get和post请求方法 let http = { 'setBaseUrl': (url) => ...