題意:給定兩個只包含』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...