CodeForces - 1215C Swap Letters(暴力+思维+模拟)
題目鏈接:點(diǎn)擊查看
題目大意:給出兩個(gè)只由字母a和字母b所組成的字符串,我們記為s和t,現(xiàn)在我們可以交換兩個(gè)字符串任意位置的字母(只能在兩個(gè)串之間交換,不能在自己串中交換),現(xiàn)在問(wèn)能否通過(guò)一定次數(shù)的交換使兩個(gè)字符串相等,如果可以求出最小交換次數(shù)
題目分析:其實(shí)這個(gè)題目挺簡(jiǎn)單的,一開始想復(fù)雜了,其實(shí)我們抽象一下,就可以發(fā)現(xiàn),對(duì)于每個(gè)位置i無(wú)非只有幾種情況:
對(duì)于第一種情況我們就不用管了,因?yàn)橐呀?jīng)是匹配好的狀態(tài)了,如果再去進(jìn)行多余的操作一定不會(huì)是最優(yōu)解,所以我們針對(duì)第二種情況討論一下,第二種情況向下還可以再分出兩種情況,如上面所示,我們稱作可操作對(duì),顯然對(duì)于每個(gè)可操作對(duì),肯定讓同類型的可操作對(duì)兩兩匹配一定是最優(yōu)的,因?yàn)橹挥凶屜嗤N類的兩兩匹配后才可以達(dá)到間接在本字符串中交換位置的目的,所以我們記q1為第一種情況的數(shù)目,q2為第二種情況的數(shù)目:
剩下的實(shí)現(xiàn)就好了,這里我選擇用deque容器實(shí)現(xiàn)上述操作,因?yàn)閐eque支持隨機(jī)訪問(wèn),操作起來(lái)方便一下,然后用vector+pair維護(hù)答案
代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int n;string a,b;cin>>n>>a>>b;deque<int>q1,q2;vector<pair<int,int>>ans;for(int i=0;i<n;i++){if(a[i]!=b[i]){if(a[i]=='a')q1.push_back(i+1);elseq2.push_back(i+1);}}if((q1.size()+q2.size())&1)//特判情況3和情況4return 0*printf("-1\n");if(q1.size()&1)//情況2{int pos=q2.front();q2.pop_front();ans.push_back(make_pair(pos,pos));q1.push_back(pos);}while(q1.size()){ans.push_back(make_pair(q1[0],q1[1]));q1.pop_front();q1.pop_front();}while(q2.size()){ans.push_back(make_pair(q2[0],q2[1]));q2.pop_front();q2.pop_front();}printf("%d\n",ans.size());for(int i=0;i<ans.size();i++)printf("%d %d\n",ans[i].first,ans[i].second);return 0; }?
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的CodeForces - 1215C Swap Letters(暴力+思维+模拟)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HDU - 2874 Connectio
- 下一篇: CodeForces - 1109A S