Irreducible Anagrams CodeForces - 1291D(前缀和)

Let’s call two strings s and t anagrams of each other if it is possible to rearrange symbols in the string s to get a string, equal to t.

Let’s consider two strings s and t which are anagrams of each other. We say that t is a reducible anagram of s if there exists an integer k≥2 and 2k non-empty strings s1,t1,s2,t2,…,sk,tk that satisfy the following conditions:

If we write the strings s1,s2,…,sk in order, the resulting string will be equal to s;
If we write the strings t1,t2,…,tk in order, the resulting string will be equal to t;
For all integers i between 1 and k inclusive, si and ti are anagrams of each other.
If such strings don’t exist, then t is said to be an irreducible anagram of s. Note that these notions are only defined when s and t are anagrams of each other.

For example, consider the string s= “gamegame”. Then the string t= “megamage” is a reducible anagram of s, we may choose for example s1= “game”, s2= “gam”, s3= “e” and t1= “mega”, t2= “mag”, t3= “e”:

On the other hand, we can prove that t= “memegaga” is an irreducible anagram of s.

You will be given a string s and q queries, represented by two integers 1≤l≤r≤|s| (where |s| is equal to the length of the string s). For each query, you should find if the substring of s formed by characters from the l-th to the r-th has at least one irreducible anagram.

Input
The first line contains a string s, consisting of lowercase English characters (1≤|s|≤2⋅105).

The second line contains a single integer q (1≤q≤105) — the number of queries.

Each of the following q lines contain two integers l and r (1≤l≤r≤|s|), representing a query for the substring of s formed by characters from the l-th to the r-th.

Output
For each query, print a single line containing “Yes” (without quotes) if the corresponding substring has at least one irreducible anagram, and a single line containing “No” (without quotes) otherwise.

Examples
Input
aaaaa
3
1 1
2 4
5 5
Output
Yes
No
Yes
Input
aabbbbbbc
6
1 2
2 4
2 2
1 9
5 7
3 5
Output
No
Yes
Yes
Yes
No
No
Note
In the first sample, in the first and third queries, the substring is “a”, which has itself as an irreducible anagram since two or more non-empty strings cannot be put together to obtain “a”. On the other hand, in the second query, the substring is “aaa”, which has no irreducible anagrams: its only anagram is itself, and we may choose s1= “a”, s2= “aa”, t1= “a”, t2= “aa” to show that it is a reducible anagram.

In the second query of the second sample, the substring is “abb”, which has, for example, “bba” as an irreducible anagram.

Sponsor

题意:
Anagrams意味着同样的字母组成,不同的顺序。
reducible Anagrams 意味着存在k≥2,使得两个属于Anagrams的两个串按照同一种分割方式分成k份,每一份都是Anagrams。

给你一个字符串,再指定一个子串S,要你求这个子串的一个anagrams串T,要求S和T无论如何如何分割,都不能组成reducible Anagrams

思路:
只有三种方式满足。

  1. l == r,此时k < 2,不符合。
  2. s[i] != s[r],此时只要把S串首尾互换得到T串,那么无论如何分割,首尾两个部分总是不符合的。
  3. 颜色大于三种。假设此时S串为 AXXXBXXXCXXXA(X代表位置)。那么T串只需要变成 CXXXAXXXAXXXB即可。同理无论如何分割首尾部分是不相同的。

串的数目可以用dp维护一个前缀和,dp[i][j]代表前i个序列为j的数目是多少。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;

char s[300005];
int dp[300005][26];

int main()
{
    scanf("%s",s + 1);
    int len = (int)strlen(s + 1);
    for(int i = 1;i <= len;i++)
    {
        dp[i][s[i] - 'a']++;
        for(int j = 0;j <= 25;j++)
        {
            dp[i][j] += dp[i - 1][j];
        }
    }
    
    int T;scanf("%d",&T);
    while(T--)
    {
        int l,r;scanf("%d%d",&l,&r);
        int cnt = 0;
        for(int i = 0;i <= 25;i++)
        {
            if(dp[r][i] - dp[l - 1][i])cnt++;
        }
        if(l == r)printf("Yes\n");
        else if(s[l] != s[r])printf("Yes\n");
        else if(cnt >= 3)printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
发布了697 篇原创文章 · 获赞 22 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/tomjobs/article/details/104319733