CodeForces - 1291D Irreducible Anagrams(思维+构造)
題目鏈接:點擊查看
題目大意:首先規定兩個字符串 s 和 t 為 Anagrams ,當且僅當字符串 t?可以通過字母重新排列后得到 s ,也就是每個字符出現的次數相同,但位置不做要求,緊接著規定另一個定義,規定若字符串 s 和字符串 t 為?reducible anagram 當且僅當兩個字符串在順序不變的情況下,被切成 k 個部分(k >= 2),且這 k 個部分全都是?Anagrams ,反之,如果字符串 s 和 t 不存在reducible anagram 的話,那么這兩個字符串的關系就是irreducible anagram
現在給出字符串 s ,再給出 m 次查詢,每次查詢問對于字符串 s 的子串 [ l , r ] 能否構造出至少一種irreducible anagram
寫給自己看的:這場cf不多評價了,我的貢獻除了A題的簽到比較快一點,其他的就真的一直在掛機了,自閉死了,最煩下標的題目,還連出了兩個,把自己心態寫崩了,還是得多練,還好隊友給力,抬了我一手,讓我沒掉分,到了比較擅長的字符串,也就是這個題目一看,結果半天讀不懂題,啥都憋不出來,最后感覺可能和區間內的顏色數量有關系,草草寫了個莫隊比賽就結束了,賽后讓隊友幫忙讀了讀題發現就是一個大水題,唉,讀題也是一個大問題,煩死了煩死了
題目分析:其實真正理解題意后反而覺得不難了,我們只需要邊猜邊構造,就差不多能想全了,這里一共有三種情況需要輸出yes,我們逐次討論
第一種,也是最簡單的一種,因為樣例中都給出了,也就是 l == r 的情況,因為此時只有一個字母,而 k 是大于等于2的,所以必不可能組成滿足條件的字符串使得形成reducible anagram
第二種,也是比較容易構造出來的,也就是 s[ l?] != s[ r ] 的情況,只需要構造出來新串令首位兩個位置互換,其余位置不變即可,因為此時的原子串 s 和新字符串 t 顯然滿足?Anagrams?的條件,但不可能滿足?reducible anagram 的條件,因為無論如何切割,都會有第一個字母和最后一個字母的不匹配,使得連帶著這一段的字符串無法對應形成?Anagrams?,也就導致了兩個字符串無法滿足條件
第三種,也是稍微比較難想到的一種,也就是區間顏色種類數大于等于三種時,一定可以構造出一種滿足yes的情況,首先如果能來到這種情況,那么顯然是 s[ l ] == s[ r ] 的情況了(如果不滿足的話在第二種情況就已經yes了),如果有三種顏色的話,那么說明當前的字符串長度至少為 4,我們舉個很簡單的例子,abca,顯然 caab 就是一個滿足?irreducible anagram 關系的字符串,為什么需要顏色數大于等于三呢,因為如果兩端相等,顏色數大于等于三就說明區間內一定有兩種字母與端點的字母不同,此時只要將這兩種字母與端點字母適當交換,就能夠形成第二種的情況了
討論完三種情況后,代碼還是非常簡單的,至于區間內顏色種類數,因為字母只有26個,寫一個簡單dp就能每次O(26)的時間復雜度查詢了,至于莫隊,不清楚會不會超時,沒試過,有心人可以去試一下
代碼:
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> #include<set> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e5+100;char s[N];int dp[N][30];int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);scanf("%s",s+1);int len=strlen(s+1);for(int i=1;i<=len;i++){for(int j=0;j<26;j++)dp[i][j]=dp[i-1][j];dp[i][s[i]-'a']++;}int m;scanf("%d",&m);while(m--){int l,r,cnt=0;//cnt記錄有多少種顏色 scanf("%d%d",&l,&r);for(int i=0;i<26;i++)if(dp[r][i]-dp[l-1][i])cnt++;if(l==r||s[l]!=s[r]||cnt>=3)puts("Yes");elseputs("No");}return 0; }?
總結
以上是生活随笔為你收集整理的CodeForces - 1291D Irreducible Anagrams(思维+构造)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51Nod - 1024 矩阵中不重复的
- 下一篇: 牛客 - maki和tree(dfs)