CF-1291D. Irreducible Anagrams(構造算法)

總結

題意:構造一個t字符串,滿足irreducible anagram ,輸出yes,否則輸出no
reducible anagram = k*irreducible anagram(k>=2)
滿足三個條件某一個即可:

第一:l==r(k>=2,才能構成reducible anagram)

第二:s[l] != s[r]

不同字符是這個題的核心點
這種字符串,可以構造一個把t字符串中與s[r]相同的字符串全部放在t的最左端,其他字符隨便放置,你會發現sk要找到tk匹配,那麼s1-k跟t1-k一定不匹配,因爲這個時候,t1-k全是s[r],但是s1-k中有一個字符s[l]。

第三:cnt>=3

上面已經處理了首尾不同字符的問題,那麼首尾相同字符

情況1:字符串不同字符數量爲1

顯而易見,|s|>=2,沒辦法構造,t是唯一的,一定是reducible anagram

情況2:字符串不同字符數量爲2

s1的所有情況,最特殊的就是就是s1的首尾字符不一樣,這種一定可以構成一個irreducible anagram,但是隻是s1== t1,剩下的就可以完成s1-k ==t1-k,就滿足了k>=2

情況3:字符串不同字符數量爲3

直接舉例子:s=aabcaa
把c構造在t的最左邊,b構造在最右邊

c要滿足一個那麼c所在的區間一定t[1,4], a和c不同
d要滿足一個那麼d所在的區間一定t[3,6] d和a不同
兩個區間一合併,就是隻是一個irreducible anagram

情況4:字符串不同字符數量爲大於等於4

就把多餘的字符串上面字符串aabcaa的bc的中間就可以了

const int N=2e5+5;
int dp[N][26],cnt[26];
signed main()///構造算法
{
    IOS;
    //file();
    string str;
    cin>>str;
    int n=str.size();
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<26;j++)
            dp[i][j]=dp[i-1][j];
        dp[i][str[i-1]-'a']++;
    }
    int q;
    cin>>q;
    while(q--)
    {
        int l,r,sum=0;
        cin>>l>>r;
        for(int i=0;i<26;i++)
            if(dp[r][i]-dp[l-1][i])
                sum++;
        if(r==l||str[l-1]!=str[r-1]||sum>=3)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章