Irreducible Anagrams
原创
©著作权归作者所有:来自51CTO博客作者caoanda的原创作品,请联系作者获取转载授权,否则将追究法律责任
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;
}