codeforces,1215C(模擬 思維)

2021-09-27 14:19:52 字數 1255 閱讀 4223

題意:給定兩個只包含』a』,'b』的長度相同字串s,t,要你將他們變成一模一樣的串,你每次可以將s中的乙個字元與t中的乙個字元交換,最後輸出次數並輸出步驟。

首先明確,相同的部分是不用動的,我們只需動不同的部分。

其次,我們分析一下s[i]!=t[i]的情況,無非就是①s[i]=『a』,t[i]='b』或②s[i]=『b』,t[i]=『a』,也不難分析出,①型別要和①型別(不能和自己)交換才可以相同,可以消除兩個不同的地方,②同理。

我們以s為基準,用兩個queue,q1,q2分別記錄所有①,②的位置。那麼就有以下情況:

1.q1.size()為偶數,q2.size()也為偶數,這種情況最為簡單,次數就是(q1.size()+q2.size())/2,步驟就是兩兩輸出q1(或q2)中的成員,再兩兩輸出q2(或q1)中的成員。

2.q1.size()為奇數,q2.size()也為奇數,我們可以將這種情況化為第1種情況,將q2中的某乙個成員複製到q1中,q2刪除掉這個成員就行了,注意最後次數是(q1.size()+q2.size())/2+1即可。

3.q1.size()為奇數,q2.size()為偶數,無解,因為無論怎樣也沒法轉化為第1種情況。

4.q1.size()為偶數,q2.size()為奇數,同3。

**如下:

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

2e5+5;

char s[maxn]

,t[maxn]

;queue<

int> q1,q2;

queue<

int> ans;

intmain()

if((q1.

size()

+q2.

size()

)%2!=

0) cout<<-1

else

}else

else}}

cout

/2

(!ans.

empty()

)}return0;

}

Codeforces 587C 樹上倍增

題意 求樹上兩點路徑中的前 a 10 小的點權值。思路 類似lca倍增演算法來儲存 i 2 j 路上的 前 10 小個 的點權值。然後要寫乙個權值合併 具體求 u v 的話,就是先分別計算 和 減1是lca會重疊 然後再合併,輸出答案。include include include include ...

Codeforces 976C 題解報告

對資料進行排序 1 按左邊的數從小到大排 2 若左邊的數相等,則按右邊的數從大到小排。排序之後,若乙個數的右邊的數小於等於上乙個數的右邊的數,則這兩個數必然符合題意。比如2 13 2 12 1 11排序之後,變為 1 11 2 13 2 12因為12 13,則有 2,12 被包含在它的上乙個數 2,...

CodeForces 948C 解題報告

題目鏈結 這道題看出來了是一道stl題,本來一開始用佇列去做,結果tle,在這裡先給出tle include using namespace std typedef long long ll const int maxn 1e5 10 int n,v maxn t maxn int main els...