<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      P11361 [NOIP2024] 編輯字符串 題解

      題目傳送門

      我的博客

      前言

      筆者在考場上的時候,心態完全崩了。

      現在回過頭來,才發覺其實靜下心來,這道題也不是不能得分。

      筆者補題時借鑒了題解,補完后為了方便自己理解于是作此篇題解。

      思路

      在一個字符串中交換兩個相鄰的字符
      ......
      兩個字符串中對應位置字符相同的出現次數最多能有多少?

      顯然,這個問題需要我們貪心求解。只要可以匹配,就盡量匹配。因為前面的匹配成功與否并不影響后面不相鄰的字符。

      于是我們可以預處理位置數組 \(p[i]\),記錄當前位置能否和前面匹配。如果可以匹配就把他們并到一個段里面。顯然,當 \(t_{i} =0\) 的時候不能匹配,此時我們就可以單獨給它開一段,表示它把前后兩個字符分開。

      再預處理每一段中 \(0,1\) 的個數。這一步可以通過判斷當前 \(s_i\)\(0\) 或者為 \(1\) 來更新。類似前綴和的思想,讓對應數組 \(+1\) 即可。

      最后從左到右,判斷 \(s_1,s_2\) 是否有相同的未使用的字符。如果有,那么 ans++,同時讓未使用的字符數量減 \(1\)。如果沒有,那么直接讓當前段中還有的字符數量減 \(1\)

      警示后人

      • 數組名稱不要混亂。

      • \(\color{red}{\text{注意字符串下標問題!}}\)

      • 第一個字符要單獨處理,位置也是!

      • 多測記得清空!

      代碼

      #include<cstdio>
      #include<iostream>
      #include<cstring>
      #include<string>
      using namespace std;
      #define int long long 
      #define ___ __int128
      #define INF 0x3f3f3f3f3f3f3f3f 
      inline int Read(){
          int x=0,f=1;
          char c=getchar();
          while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
          while(isdigit(c)){x=x*10+c-48;c=getchar();}
          return x*f;
      }
      inline void Write(int x){
      	if(x<0) {putchar('-');x=-x;}
      	if(x>9) Write(x/10);
      	putchar(x%10+'0');
      }
      const int N=1e5+10;
      string s1,s2,t1,t2;
      int T,n,ans;
      int f[N][10],p[N][5];
      /*
      f[i][1]:s1 中 1 的個數,f[i][2]: s1 中 0 的個數
      f[i][3]:s2 中 1 的個數,f[i][4]: s2 中 0 的個數
      p[i][1]: s1 中的 p[i]
      p[i][2]: s2 中的 p[i]
      */
      void solve(){
      	ans=0;//清空!!
      	for(int i=0;i<=n;i++){//清空
      		for(int j=0;j<=4;j++) f[i][j]=0;
      		for(int j=0;j<=2;j++) p[i][j]=0;
      	}
      	n=Read();
      	cin>>s1>>s2>>t1>>t2;
      	s1=" "+s1,s2=" "+s2,t1=" "+t1,t2=" "+t2;//筆者這里字符串習慣從下標 1 開始
      
          //第一個字符單獨處理
      	if(s1[1]=='1') f[1][1]++;
      	else f[1][2]++;
      	if(s2[1]=='1') f[1][3]++;
      	else f[1][4]++;
      	p[1][1]=p[1][2]=1;
          //處理 s1
      	for(int i=2;i<=n;i++){//注意下標從第二個字符開始!筆者調了好久!!
      		if(t1[i]=='1'&&t1[i-1]=='1') p[i][1]=p[i-1][1];//如果可以交換
      		else p[i][1]=i;//否則自己單獨開一段
      		if(s1[i]=='1') f[p[i][1]][1]++;//1 的個數
      		else f[p[i][1]][2]++;// 0 的個數
      	}
          //處理 s2,同上
      	for(int i=2;i<=n;i++){
      		if(t2[i]=='1'&&t2[i-1]=='1') p[i][2]=p[i-1][2];
      		else p[i][2]=i;
      		if(s2[i]=='1') f[p[i][2]][3]++;
      		else f[p[i][2]][4]++;
      	}
          //從左到右貪心匹配
      	for(int i=1;i<=n;i++){
      		if(f[p[i][1]][2]&&f[p[i][2]][4]) ans++,f[p[i][1]][2]--,f[p[i][2]][4]--;
      		else if(f[p[i][1]][1]&&f[p[i][2]][3]) ans++,f[p[i][1]][1]--,f[p[i][2]][3]--;		
      		else if(f[p[i][1]][2]) f[p[i][1]][2]--,f[p[i][2]][3]--;
      		else f[p[i][1]][1]--,f[p[i][2]][4]--;
      	}
      	printf("%lld\n",ans);
      } 
      signed main(){
      	T=Read();
      	while(T--){
      		solve();//多測函數好!
      	}
      	return 0; 
      }
      
      posted on 2025-11-04 08:43  _Liuliuliuliuliu  閱讀(7)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 国产网友愉拍精品视频手机| 精品中文人妻在线不卡| 久久男人av资源站| 国产最新精品系列第三页| 制服 丝袜 亚洲 中文 综合| 偷自拍另类亚洲清纯唯美| 精品国产一区二区三区av性色| 欧美人与动zozo在线播放| 人妻体内射精一区二区三区| 亚洲成人一区二区av| 亚洲色大成网站WWW久久| 高级艳妇交换俱乐部小说| 吃奶还摸下面动态图gif| 成人精品色一区二区三区| 人妻无码不卡中文字幕系列| 亚洲欧洲精品一区二区| 九九热在线观看视频精品| 麻豆国产成人AV在线播放| 日本中文一二区有码在线| 国产免费一区二区不卡| 成人无码特黄特黄AV片在线| 久久久久蜜桃精品成人片公司| 热久在线免费观看视频| 久久这里都是精品一区| 天天躁久久躁日日躁| 日本视频一区二区三区1| 年轻女教师hd中字3| 亚洲AV成人一区国产精品| 另类 专区 欧美 制服| 99蜜桃在线观看免费视频网站 | 国产91色综合久久免费| 亚洲色欲色欲www在线看| 亚洲中文字幕在线二页| 快好爽射给我视频| 色悠悠国产在线视频一线| 国产成人啪精品午夜网站| 国产激情艳情在线看视频| 一 级做人爱全视频在线看| 国产精品成人午夜福利| 亚洲色大成永久WW网站| 伊人狠狠色j香婷婷综合|