Codeforces Round #616 (Div. 2) D (找规律题)

找不可简化的相同字母异序词:

链接: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;}

猜你喜欢

转载自www.cnblogs.com/sweetlittlebaby/p/12662019.html