日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

codeforces E. Picking Strings 构造

發(fā)布時(shí)間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces E. Picking Strings 构造 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接

Picking String

題意

給出字符串S和T,1e5個(gè)詢問,每次詢問S的一段區(qū)間是否能轉(zhuǎn)變成T的一段區(qū)間。
轉(zhuǎn)變方式:

  • A>BCA>BC
  • B>ACB>AC
  • C>ABC>AB
  • AAAAAA可以消除

題解

我們從以上四個(gè)條件出發(fā)推導(dǎo)出更加精華的條件

  • B>AC>AAB>AAAC>CB>AC>AAB>AAAC>C
  • C>AB>AAC>AAAB>BC>AB>AAC>AAAB>B
  • A>BC>BBA>BC>BB

也就是說所有的CC都等價(jià)于BB

由于B>ACB>AC也就是B>ABB>AB,而3個(gè)AA可以消除,這個(gè)操作意味著B前面可以有任意多個(gè)AA,所以說,BB前面的緊貼著的AA的數(shù)量我們可以忽略。

由于B>AB>BBB>ABBB>BBBBBA>BB>ABB>BBBBB>AB>BBB>ABBB>BBBBB,A>BB>ABB>BBBB也就是說,我們只要有一個(gè)AA或者BB就可以在這基礎(chǔ)上增加偶數(shù)個(gè)BB
那么問題就比較清楚了。

但是T[c,d]T[c,d]串最后的AA是一定要被S[a,b]S[a,b]最后的A抵消掉,因?yàn)闆]有操作可以生成A并且把A插入到S[a,b]S[a,b]的最后。

分如下情況討論:

  • 如果S[a,b]S[a,b]最后的AA不足以抵消掉T[a,b]T[a,b]的A,那么輸出0,否則記錄S[a,b]后面的A與T[a,b]的后面的A的差值,記做delta2delta2

  • 如果delta2=0delta2=0那么只需要比較S[a,b]S[a,b]中的BB的數(shù)量和T[c,d]T[c,d]中的BB的數(shù)量,如果T[c,d]T[c,d]BB的數(shù)量大于S[a,b]S[a,b]BB的數(shù)量,那么差值必定要為2的倍數(shù),并且如果T[c,d]T[c,d]BB的數(shù)量不為0,那么S[a,b]S[a,b]BB的數(shù)量也必須不為0(無法從空串生成BBBB)。

  • 如果delta2>0delta2>0那么如果S[a,b]S[a,b]BB的數(shù)量小于T[c,d]T[c,d]中B的數(shù)量,并且差值為偶數(shù)時(shí)候,S[a,b]S[a,b]多出來的AA可以用來生成BBBB,并且多余的A作為B的前綴可以被消除掉。

  • 如果delta2>0delta2>0那么如果S[a,b]S[a,b]BB的數(shù)量等于T[c,d]T[c,d]中B的數(shù)量,那么delta2delta2一定要被3整除。這樣可以通過消除來得到TT<script type="math/tex" id="MathJax-Element-56">T</script>


代碼

#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 2e5+7; char S[maxn],T[maxn]; int Q,a,b,c,d; int sumS[maxn],sumT[maxn]; int lastS[maxn],lastT[maxn]; int main(){scanf(" %s %s %d",S,T,&Q);for(int i = 0;S[i];++i){sumS[i+1] = sumS[i] + (S[i] == 'C' || S[i] == 'B');lastS[i+1] = lastS[i];if(S[i] == 'B' || S[i] == 'C')lastS[i+1] = i+1;}for(int i = 0;T[i];++i){sumT[i+1] = sumT[i] + (T[i] == 'C' || T[i] == 'B');lastT[i+1] = lastT[i];if(T[i] == 'B' || T[i] == 'C')lastT[i+1] = i+1;}while(Q--){scanf("%d%d%d%d",&a,&b,&c,&d);int delta = sumT[d]-sumS[b]+sumS[a-1]-sumT[c-1];int delta2 = b - max(a-1,lastS[b]) - (d - max(c-1,lastT[d]));if(delta < 0 || delta % 2 != 0 || delta2 < 0 || delta2 == 0 && !(sumS[b] - sumS[a-1]) && delta > 0) {putchar('0');continue;}if(delta2 == 0 || delta > 0 || delta2 % 3 == 0)putchar('1');else putchar('0');}return 0; }

總結(jié)

以上是生活随笔為你收集整理的codeforces E. Picking Strings 构造的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。