找不可简化的相同字母异序词:
链接:https://codeforces.com/contest/1291/problem/D
题意:定义anagram表示两个字符串的字符组成相同。
定义reducible anagram,表示可以两个字符串可以拆分成k个子串,且每个子串都是anagram的。
irreducible anagram 就是不满足条件的。
给个字符串,找在l~r区间内可否找到一个irreducible anagram
分情况讨论:
1,l=r,可以;
2,s[l]!=s[r],可以;我们将尾巴放在头前边,那么对于任意长度的t1,t1它绝对比s1要多出一个尾字母,所以就存在一个不可约重组字符串,例如:gamegame , eegamgam
3,如果 s[l]=s[r]如果中间存在三种或者以上的字母时 可以,我们将所有不同的字符串整理在一起按任意顺序排列,那么由于头和尾是一样的,无论怎么排都会多出一个尾字母,例如:abccabba , ccbbbaaa(问题就转化为统计区间内有多少种不同字母);
其他情况都不行,
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 2e5 + 5;
char ch[MAXN];
int qzh[30][MAXN];
int main()
{
scanf("%s", ch + 1);
int len = strlen(ch + 1);
for (int i = 1; i <= len; i++)
for (int j = 0; j < 26; j++)//前缀和统计字母数量
if (j == ch[i] - 'a')
qzh[ch[i] - 'a'][i] = qzh[ch[i] - 'a'][i - 1] + 1;
else
qzh[j][i] = qzh[j][i - 1];
int q;
int l, r;
scanf("%d", &q);
while (q--)
{
scanf("%d%d", &l, &r);
if (r == l)
printf("Yes\n");
else if (ch[l] != ch[r])
printf("Yes\n");
else if (ch[l] == ch[r])
{
int kd = 0;
for (int i = 'a'; i <= 'z'; i++)
if (qzh[i - 'a'][r] - qzh[i - 'a'][l - 1] > 0)
kd++;
if (kd >= 3)
printf("Yes\n");
else
printf("No\n");
}
else
printf("No\n");
}
return 0;}