​D. Irreducible Anagrams​

存在\(irreducible\ anagram\)只有三种情况:

①长度为1

②长度为2,且​​s[l-1]!=s[r-1]​

③长度大于2

①和③很容易可以得出,这里只证明一下情况②

假设只存在 a,b,开头和结尾都是 a,那么匹配肯定是这样的:\(\begin{cases}a.....a\\b.....b\end{cases}\),我们撇开开头结尾不看,那么中间的上面部分肯定比下面多两个 b。

对于中间部分,我们忽略​​a->a​​​和​​b->b​​的这两种情况,那么就只剩下,\(\begin{cases}..a..b..\\..b..a..\end{cases}\),这两种对应方式了,而这两种对应方式正好把上下的 a 和 b 相互抵消了,那么就必然存在两个孤立的\(\begin{cases}..b..\\..a..\end{cases}\)来对应开头和结尾,因而把整个字符串分成两部分。

// Created by CAD on 2020/2/2.
#include <bits/stdc++.h>
using namespace std;

const int maxn=2e5+5;
int a[maxn][30];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
string s; cin>>s;
int slen=s.length();
for(int i=0;i<slen;++i)
{
for(int j=1;j<=26;++j)
a[i+1][j]=a[i][j];
a[i+1][s[i]-'a'+1]++;
}
int q; cin>>q;
while(q--){
int l,r; cin>>l>>r;
if(l==r) cout<<"Yes\n";
else{
int cnt=0;
for(int i=1;i<=26;++i)
if(a[l-1][i]-a[r][i]) cnt++;
if(cnt==1) cout<<"No\n";
else{
if(cnt>2) cout<<"Yes\n";
else{
if(s[l-1]==s[r-1]) cout<<"No\n";
else cout<<"Yes\n";
}
}
}
}
return 0;
}