CF1370E-Binary Subsequence Rotation
0|1题意:
给定 \(0,1\) 构成的串 \(s,t\),若能通过 \(s\) 串旋转的方式,进行字母重排,让其变成 \(t\) 串,输出最小旋转次数,反之,则输出 \(-1\)。
\(1≤n≤10^6\)
0|1分析:
要想有解,肯定两个串中的 \(0,1\) 的个数要相等。
考虑把 \(s\) 串中和 \(t\) 串对应位置不相等的字符拿出组成一个新的 \(0,1\) 串,原过程就相当于不断地从该新的序列中拿出 \(01010101\) 或 \(101010\) 形式的串,然后该序列不断的变小,直到长度为 \(0\)。可以用两个变量来存 \(0\) 和 \(1\) 的个数,同时进行消除。
0|1代码:
#include <bits/stdc++.h> using namespace std; const int N=1e6+5; char s[N],t[N]; int main() { int n,cnt1=0,cnt2=0,zero=0; scanf("%d",&n); scanf("%s%s",s+1,t+1); for(int i=1;i<=n;i++) { if(s[i]!=t[i]) { if(s[i]=='0') { cnt1++,zero++; if(cnt2>0) cnt2--;//消除重复,一个0和一个1消除只要一次 } else { cnt2++,zero--; if(cnt1>0) cnt1--;//消除重复,一个0和一个1消除只要一次 } } } if(zero) printf("-1\n"); else printf("%d\n",cnt1+cnt2); return 0; }
另外看到了下面的代码,很精简,相当于是上面过程的压缩版。
#include <bits/stdc++.h> using namespace std; int main() { int n; string s, t; cin >> n >> s >> t; int zero = 0, mi = 0, mx = 0; for (int i = 0; i < n; i++) { if (s[i] != t[i]) { if (s[i] == '0') zero++; //zero > 0 是最长的连续为 0 的长度 else zero--; //zero < 0 是最长的不被抵消的连续为 1 的长度 mi = min(mi, zero); mx = max(mx, zero); } } cout << (zero == 0 ? mx - mi : -1); }
__EOF__
作 者:xzx9
出 处:https://www.cnblogs.com/1024-xzx/p/13191221.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步