Irreducible Anagrams

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->ab->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;
}
posted @ 2020-02-03 15:33  caoanda  阅读(190)  评论(0编辑  收藏  举报