CF1736D-Equal-Binary-Subsequences题解
题意:给你一个长为
的 01 序列 ,你可以选择它的一个子序列,将这个子序列循环右移一位。问是否能使得最终序列满足:可以严格分成两个完全相同的子序列。
显然,当 0/1 的个数为奇数时一定无解。于是只考虑为偶数的情况。
我们可以发现一个性质:我们选中的子序列一定是严格 01 交替的(相邻两个不同、第一位和最后一位也不同),否则一定可以删除一些元素使得效果完全不变。而当我们选中 01 交替的子序列循环右移时,相当于将这个子序列中元素取反。
思考发现,“可以严格分成两个完全相同的子序列”这个限制本身比较复杂,难以判断,于是我们可以猜测有一种平凡的操作策略满足条件。有一种显然能严格分开的序列,即第
int main()
{
#ifdef LOCAL
freopen("input.txt", "rt", stdin);
freopen("output.txt", "wt", stdout);
#endif
int ta;
cin>>ta;
forn(ifa,0,ta) {
int n;
string s;
cin>>n>>s;
vi ans;
int cur = 0;
for(int i = 1; i < 2*n; i+=2) {
if(s[i] != s[i-1]) {
if((s[i] - '0') == cur) ans.pb(i);
else ans.pb(i-1);
cur ^= 1;
}
}
if(ans.size()%2) {
cout<<"-1\n";
continue;
}
cout<<ans.size();
for(auto x : ans) cout<<' '<<x+1; cout<<'\n';
forn(i,0,n) cout<<2*i+1<<' '; cout<<'\n';
}
}
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步