牛客小白月賽4 F 等價串題解

2021-10-12 06:51:40 字數 1852 閱讀 3430

演算法分析

解題**

一串長度為n的字串a和一串長度為m的字串b。並且這兩串字串只會含有01

鐵子可以對字串a執行兩種操作,兩種操作可以執行任意次。

現在問,字串a可以變成字串b嗎?

第一行有乙個整數t,表示有**t(1<=t<=1000)**組測試資料。

接下來的每組資料,第一行有兩個整數n,m(1<=n,m<=100),表示字串a和字串b的長度。

接下來有兩行字串,分別表示字串a和字串b

對於每組測試資料,如果字串a可以變為字串b,則輸出一行**」yes」,否則輸出一行」no」**.輸出不包括引號。

3

3 4010

1110

3 4010

1111

7 20001000

00

yes

noyes

對於第乙個樣例,鐵子可以對字串a使用一次無情替換可以變成1110

剛拿到這道題,以為很複雜,結果很簡單

這道題思維轉變一下,把串a串b中的字元同時轉換成字元1,最後如果串a串b相等,或者說串a串b的長度相差3*n個字元1,即可以變換(因為3個字元1對於串a來說是可以被刪除的,對於串b來說是可以被增加的)。

那麼現在的問題來了,怎麼將兩個字串都轉換成只包含1的字串呢?

#include

#include

#include

using

namespace std;

intmain()

for(

int i =

0; i < s2.

size()

; i++

) ss2 +

="11"

;//用11替換0

}else

ss2 +

= s2[i]

;//原本的1就保留下來

}//如果兩個串相同,或者兩個串長度相差3*n就說明,可經過變換得到

if(ss1 == ss2 ||

abs(

(int

)ss1.

size()

-(int)ss2.

size()

)%3==

0)cout <<

"yes"

<< endl;

else

cout <<

"no"

<< endl;

}return0;

}

牛客小白月賽22題解

a 操作序列 單點增加,區間求和,下標最小的非零數變成零,單點查詢。說完了不就線段樹嘛。由於範圍比較大,先存下來,離散化,再進行樹上的操作。注意這裡的左右區間離散化值不一樣的,左邊離散化要找到大於等於左邊界的值,右邊離散化要找到小於等於右邊界的值。b 樹上子鏈 類似於 dp 求樹直徑 c 交換遊戲 ...

牛客小白月賽24 題解

牛客小白月賽24 題解 最後還剩一道計算幾何,其實可以ak,但沒必要 b 簽到 include using namespace std const int n 2e5 10 int a n int main printf d n ans return 0 c 還行 includeusing name...

牛客小白月賽22 題解

題解鏈結 題目知識點 題目難度 a 操作序列 stl,map,set,模擬 普及 提高 b 樹上子鏈 樹形dp,樹的直徑 普及 提高 c 交換遊戲 記憶化搜尋,狀態壓縮 普及 提高 d 收集紙片 全排列,dfs,狀壓dp,tsp問題 普及 提高 e 方塊塗色 簡單數論,容斥原理 入門f 累乘數字 找...