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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

CodeForces - 1215C Swap Letters(暴力+思维+模拟)

發(fā)布時(shí)間:2024/4/11 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1215C Swap Letters(暴力+思维+模拟) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:點(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ú)非只有幾種情況:

  • a[i]==b[i]
  • a[i]!=b[i]
  • a[i]='a',b[i]='b'
  • a[i]='b',b[i]='a'
  • 對(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ù)目:

  • q1為偶數(shù),q2為偶數(shù):我們直接兩兩匹配即可
  • q1為奇數(shù),q2為奇數(shù):我們需要將一個(gè)q2放到q1中去,也就是執(zhí)行一次swap(i,i)的操作,這樣就是第一種情況了
  • q1為奇數(shù),q2為偶數(shù):無(wú)解
  • q1為偶數(shù),q2為奇數(shù):無(wú)解
  • 剩下的實(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)題。

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