Codeforces #616 Div2 D. Irreducible Anagrams

这里是传送门:Codeforces #616 Div2 D. Irreducible Anagrams
题意是定义anagram,表示两个字符串的字符组成相同。
定义reducible anagram,表示可以两个字符串可以拆分成k个子串,且每个子串都是anagram的。
定义irreducible anagram 表示不满足reducible anagram条件的。
给定一个字符串,q次询问,每次询问[l,r]区间串,能否找到一个irreducible anagram。

思路:
主要是题意难读吧。
情况只有三种:

  1. k==1
  2. 首尾字符不同 (交换首尾就变得不一样)
  3. 不同字符数大于2(容易推出得到第二点)

情况1.2比较简单判断,3的话用个set存字符出现下标然后二分判断是否在lr区间就可以了。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define ll unsigned long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
#define eps 1e-6
#define pi acos(-1)
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("Yes") ;}
void put2(){ puts("No") ;}
void put3(){ puts("-1"); }
 
const int manx=3e4+5;
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
int main()
{
    string s;
    cin>>s;
    set<ll>index[26];
    for(int i=0;i<s.size();i++)
        index[s[i]-'a'].insert(i+1);
    ll p=read();
    while(p--)
    {
        ll l=read(),r=read();
        if(l==r) put1();
        else if(s[l-1]!=s[r-1]) put1();
        else{
            int cnt=0;
            for(int i=0;i<26;i++){
                auto it=index[i].lower_bound(l);
                if(it!=index[i].end()&&*it<=r) cnt++;
            }
            if(cnt>2) put1();
            else put2();
        }
    }
    return 0;
}
发布了61 篇原创文章 · 获赞 23 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/JiangHxin/article/details/104161433
今日推荐