首页 > 其他分享 >「杂题乱刷2」CF1889A Qingshan Loves Strings 2

「杂题乱刷2」CF1889A Qingshan Loves Strings 2

时间:2024-07-26 21:06:57浏览次数:9  
标签:CF1889A cout ll Qingshan long re Loves 杂题 define

vp 到的。

题目链接

CF1889A Qingshan Loves Strings 2

解题思路

我们考虑从头到尾依次判断情况。

维护两个指针 \(l,r\) 来依次比较,直到有 \(a_l = a_r\)。

这种情况根据题目所述是不合法的,因此我们需要依次分讨一下两种情况:

  • \(a_l = a_r = 1\),这时我们只需要在 \(s_l\) 前加上 \(01\) 即可满足这两个字符不等的条件。

  • \(a_l = a_r = 0\),这时我们只需要在 \(a_r\) 后加上 \(01\) 即可满足这两个字符不等的条件。

容易发现每次操作要么对字符串造成至少 \(1\) 的贡献,要么造成负数的贡献,也就是不合法的情况。

一直做操作直到当前字符串合法或者操作超过 \(300\) 次并判断无解即可。

时间复杂度 \(O(nV)\),其中 \(V\) 为操作次数。

参考代码

点击查看代码
/*
Tips:

你数组开小了吗?
你MLE了吗?
你觉得是贪心,是不是该想想dp?
一个小时没调出来,是不是该考虑换题?
打 cf 不要用 umap!!!

记住,rating 是身外之物。

该冲正解时冲正解!

Problem:

算法:

思路:

*/
#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define forll(i,a,b,c) for(re ll i=a;i<=b;i+=c)
#define forrr(i,a,b,c) for(re ll i=a;i>=b;i-=c)
#define mid ((l+r)>>1)
#define lowbit(x) (x&-x)
#define pb push_back
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);init();
#define endl '\n'
#define QwQ return 0;
#define db long double
#define ull unsigned long long
#define lcm(x,y) x/__gcd(x,y)*y
#define Sum(x,y) 1ll*(x+y)*(y-x+1)/2
#define aty cout<<"Yes\n";
#define atn cout<<"No\n";
#define cfy cout<<"YES\n";
#define cfn cout<<"NO\n";
#define xxy cout<<"yes\n";
#define xxn cout<<"no\n";
#define printcf(x) x?cout<<"YES\n":cout<<"NO\n";
#define printat(x) x?cout<<"Yes\n":cout<<"No\n";
#define printxx(x) x?cout<<"yes\n":cout<<"no\n";
#define maxqueue priority_queue<ll>
#define minqueue priority_queue<ll,vector<ll>,greater<ll>>
void Max(ll&x,ll y){x=max(x,y);}
void Min(ll&x,ll y){x=min(x,y);}
/*

0011100011

我擦,不等于。。。

001110

*/
ll t;
ll n;
ll pd;
string s;
vector<ll>ans; 
string F(string s,ll x)//s0~sx-1+01+sx~s_sz 
{
//	cout<<"cg:"<<x<<endl; 
	string S="";
	ll len=s.size();
	forl(i,0,x-1)
		S+=s[i];
	S+="01";
	forl(i,x,len-1)
		S+=s[i];
//	cout<<"F:"<<S<<endl;
	return S;
}
bool check(string s)
{
//	cout<<"ck:"<<s<<endl;
	ll sz=s.size();
	forl(i,0,sz-1)
		if(s[i]==s[sz-i-1])
		{
		//	cout<<i<<' '<<sz-i<<endl;
			return 0;
		}
	return 1;
}
void f(string&s)
{
	ll L=0,R=(ll)s.size()-1;
	while(L<R)
	{
		if(s[L]!=s[R])
		{
			L++,R--;
			continue;
		}
		if(s[L]=='0')
		{
			ans.pb(R+1);
			s=F(s,R+1);
			return ;
		}
		else
		{
			ans.pb(L);
			s=F(s,L);
			return ;
		}
	}
	pd=1;
}
void _clear(){ans.clear(),n=0,s="";pd=0;}
void solve()
{
	_clear();
	cin>>n>>s;
	//s=' '+s;
	while(ans.size()<305 && !pd)
	{
		f(s);
	//	cout<<s<<endl;
	}
	if(!check(s))
	{
		cout<<-1<<endl;
		return ;
	}
	cout<<ans.size()<<endl;
	for(auto i:ans)
		cout<<i<<' ';
	cout<<endl; 
}
void init(){}
int main()
{
	IOS;
	t=1;
 	cin>>t;
	while(t--)
		solve();
	QwQ;
}

标签:CF1889A,cout,ll,Qingshan,long,re,Loves,杂题,define
From: https://www.cnblogs.com/wangmarui/p/18326249

相关文章

  • 「杂题乱刷2」CF1513C
    duel到的。题目链接CF1513CAddOne(luogu)CF1513CAddOne(codeforces)解题思路我们发现,初始数列中的每个数字变为\(10\)必定只需要至多\(10\)次,于是我们可以直接预处理出\(10\)这个数字经过\(i\)次变化后能形成多少位的数字即可。状态为\(dp_{i,j}\)表示\(1......
  • 【题解】Solution Set - 杂题选讲「刘君实」
    https://www.becoder.com.cn/contest/5423「HNOI2012」集合选数感觉差不多会。7/25sh杂题听课情况NOI2018冒泡排序【40】几乎不会麦田里的守望者【40】打表找规律、最后dp不太理解星空列车【40】完全不会WereYouLast:知道怎么做,但是不知道为什么是对的A......
  • 「杂题乱刷2」P3107
    题目链接P3107[USACO14OPEN]OdometerS解题思路数位dp模板。令某个数的特殊数字为在一个数字中至少出现过一半的数位的数字。首先我们可以依次拆分数位来枚举当某个数位为特殊数字时来进行数位dp,状态为\(dp_{last,len,num,sum,\_1,\_0}\)来代表还剩余\(last\)个数位......
  • 2024 暑假集训杂题选做
    目录写在前面CF1981DCF1992F写在最后写在前面我是飞物。CF1981D2400妈的好诡异的题场上拿到这题我都不知道我要干啥呃呃考虑到每个合数均为若干质数的乘积,则若构造方案中有合数,可以将合数替换为质数从而减少使用的权值的种类数,于是仅需考虑使用质数构造,则此时并不需要考虑具......
  • 「杂题乱刷2」CF1615C Menorah
    题目链接CF1615CMenorah(luogu)CF1615CMenorah(codeforces)解题思路这题有三个重要的性质:在同一个点做两次操作与不在这个点做操作是等价的。给两个不同的点做操作等价于交换这两个点。给一个字符串做偶数次操作,这个字符串的\(0\)的数量和\(1\)的数量不会改......
  • 「杂题乱刷2」CF1015D Walking Between Houses
    duel到的。题目链接CF1015DWalkingBetweenHouses解题思路一道细节题。思路很简单,肯定是一开始能走的越多越好,因此就有一种较好实现的方案,先每次走\(n-1\)格,但由于每次至少要走一格,因此如果不够走了就把能走的都走掉,之后全走\(1\)步即可。时间复杂度\(O(k)\)。参......
  • 「杂题乱刷2」CF727D
    duel到的。题目链接CF727D解题思路首先只能选一个尺码的人直接给就是了,这样我们就只用考虑选两个尺码的人了。因为两个尺码的人适合的两个尺码是相邻的,因此我们直接从小到大按照有两个尺码的人排序,再将剩下的衣服大小从小到大排序,然后依次给就可以了。这里我用了桶排,时间复......
  • 「杂题乱刷2」CF1506E Restoring the Permutation
    duel到的。题目链接CF1506E解题思路有一个显然的性质就是这个序列的前缀最大值是单调不降的。于是我们就可以对于每个位置考虑还可以填哪些数,对于字典序最小的肯定填当时可填的最小数字,对于字典序最大的肯定填当时可填的最大数字,因为你可以通过填一个数的方式来满足要求,因此......
  • Spark Special_杨宁远 杂题分析.md
    SparkSpecial图论_杨宁远杂题分析Date:2024-07-03Preface本文基于杨宁远@ynycoding的课件与题单,对省选/NOIP阶段图论的建模方法和解题策略进行总结,以及本阶段常用方法、模型和Trick。A.[AGC056C]0/1Balanced[AGC056C]01Balanced-洛谷|计算机科学教育新生态(......
  • 「杂题乱刷2」CF402D Upgrading Array
    题目链接CF402DUpgradingArray(luogu)CF402DUpgradingArray解题思路首先有一个很显然的结论,就是你一旦在第\(i\)个位置上做了一次操作后,那么你之后所有在第\(j(i\lej)\)个位置做的操作都无效了,因为此时前缀的公因数为\(1\)了。因此有个很显然的结论就是操作需要......