首页 > 其他分享 >Codeforces Round 938 (Div. 3) E

Codeforces Round 938 (Div. 3) E

时间:2024-04-09 17:47:08浏览次数:14  
标签:return int 可以 Codeforces else flag 938 Div

链接

有点意思的题目。
首先可以得到的一个结论就是,如果k能够完成,那唯一的操作方法就是从前往后,遇到0就使用,把这个点变成1。

那么我们就能够做到O(n)验证了,然后发现O(n^2)可以接受,就过了。

但是我因为滥用数据结构,导致我认为验证需要O(nlogn)然后5000又刚刚好跑不过去。
所以觉得做法假了,尝试从减少验证的次数上下手。
首先可以发现一个性质,就是如果k=m的时候是可以分解完成的,那么m的所有因子作为k也是可以的,
那假如能够证明,所有合法的k都是一个数字的因子的话,那这题就可以通过质因数分解的方法来做到两个log
很明显,不可以。反例:011110 k=5和2都可以。
然后就做法假了。

死因:没有发现滑动窗口是不需要动态维护前缀和的,只需要O(1)即可维护。
这一点记下来,以后还是尽量少用树状数组吧。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
	char c=getchar();int a=0,b=1;
	for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1;
	for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48;return a*b;
}
int dp[2000501];//注意数组大小
char str[2000501],s[2000501];
int odd[2000501],even[2000501];
int len,N;
bool cherk(int l,int r)
{
	int mid=l+r>>1;
	if((r-l+1)%2==0)
	{
		if(odd[mid]>=(r-l+1))return 1;
		else return 0;
	}
	else
	{
		if(even[mid]>=(r-l+1))return 1;
		else return 0;
	}
} 	
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int T=read();char c1;
	for(int t=1;t<=T;t++)
	{
		for(int i=0;i<=N;i++)
		{
//			str[i]=s[i]=0;
			dp[i]=0;
			odd[i]=even[i]=0;
		}
		for(int i=0;i<=N+2;i++)str[i]=0;
		N=0,len=0;
		scanf("%s",s+1);
		if(t==1)c1=s[1];
	    int N=0,len=strlen(s+1);
	    bool flag=0;dp[1]=dp[0]=0;
	    for(int i=2;i<=len;i++)
	    {
	    	if(len%2==1&&(i==(1+len>>1)))continue;
	    	if(s[i]!=s[1])flag=1;
		}
		if(s[1]!=s[len])flag=1;
		if(flag==0)
		{
			cout<<"No"<<endl;
			continue;
		}
	    for(int i=1;i<=len;i++)
	    {
	    	dp[i]=0;
		}
	    str[0]='$';//防止越界
	    for(int i=1;i<=len;i++)
		{
	        str[++N]='#';
	        str[++N]=s[i];
	    }
	    str[++N]='#',str[++N]='@';//最后再加一个@
	    int right=0,pos=0;
	    for(int i=1;i<=N;i++)dp[i]=0;
	    for(int i=1;i<=N;i++){
	        if(i<right)
	            dp[i]=min(dp[2*pos-i],right-i);
	        else
	            dp[right=i]=1;
	        while(str[i-dp[i]]==str[i+dp[i]])
	            dp[i]++;
	        if(i+dp[i]>right)
	            right=i+dp[i],pos=i;
	    }
	    int ret=0;
	    for(int i=1;i<=N;i++)
	        ret=max(ret,dp[i]-1);//找最长回文
	    for(int i=1;i<=N;i++)
	    {
	    	if(i%2==1)
	    	{
	    		odd[i/2]=dp[i]-1;
			}
			else
			{
				even[i/2]=dp[i]-1;
			}
		}
	    if(ret!=len)
	    {
	    	cout<<"Yes"<<endl;
	    	cout<<1<<endl;
	    	for(int i=1;i<=len;i++)
			{
				cout<<s[i];
			}
			cout<<endl;
	    	continue;
		}
		flag=0;
		for(int i=2;i<len;i++)
		{
			if(s[i+1]!=s[i-1])flag=1;
		}
		if(flag==0)
		{
			cout<<"No"<<endl;
			continue;
		}
		int mid=0;
		for(int i=2;i<len;i++)
		{
			if(cherk(1,i)==0&&cherk(i+1,len)==0)
			{
				mid=i;
				break;
			}
		}
		if(mid==0)
		{
			cout<<"No"<<endl;
			continue;
		}
		cout<<"Yes"<<endl;
		cout<<2<<endl;
//		}
		for(int i=1;i<=mid;i++)
		{
			cout<<s[i];
		}
		cout<<' ';
		for(int i=mid+1;i<=len;i++)
		{
			cout<<s[i];
		}
		cout<<endl;
	}
	return 0;
}
/*
1
aabaaabaa

aababaa

1
aaabaaa
*/

标签:return,int,可以,Codeforces,else,flag,938,Div
From: https://www.cnblogs.com/HLZZPawa/p/18124434

相关文章

  • Codeforces Global Round 25 E
    链接其实还是很好写的。其实很明显,手玩一下就可以发现只用1次或者两次就可以分完,否则就是以下3中情况。aaaaaaaaabaaaabababa这个证明很简单。难在怎么想。其实就是手玩以下,看看怎么样分不了,然后就可以了。样例具有一定的迷惑性,还是很好解决的。然后马拉车数组清空要清到......
  • tomcat AJP 任意文件读取/包含漏洞(CVE-2020-1938)
    漏洞描述TomcatAJP协议中存在缺陷,攻击者可以读取或包含Tomcat的webapp目录中的任何文件。漏洞危害:读取webapp配置文件或源代码。如果攻击者读取配置文件得到敏感用户名和下面,tomcatWeb应用开放manager目录具有文件上传功能2.1可以直接上传shell获取控制权,2.2通过Gho......
  • P4677DeerInZooDivOne
    费用流#二分图最大权匹配#dp\(dp_{x,y}\)表示以\(x,y\)为对应点的最大同构子树的大小对于一对点,转移为将\(x,y\)中的点按照一定顺序对应那么问题转化为如何求一组匹配,使得两两匹配的权值尽可能大,即一个二分图最大权匹配,可以费用流解决然后枚举断开的每条边,对左右都做上......
  • P4112DrawingPointsDivOne
    二分具有单调性,考虑二分答案对于\(x\)考虑怎么\(check\),可以暴力的展开\(x\)次,再缩小\(x\)次,如果得到的结果和初始状态相同,那么就合法,否则不合法//Author:xiaruizeconstintN=1e3+10;intn;piia[N];bools[N][N],cur[N][N],mp[N][N];boolcheck(intx)......
  • 2024.4.7 训练1(rating) Codeforces Global Round 25
    https://codeforces.com/contest/1951题解参考:https://zhuanlan.zhihu.com/p/691034931A题一开始的思路比较绕,wa很多发卡了半小时才过。hansun的思路比较硬直,他在极短的时间内过了Ahansun的题解:https://codeforces.com/contest/1951/submission/255262403我的想法是分奇偶情......
  • CodeTON Round 8 (Div. 1 + Div. 2, Rated, Prizes!)
    目录写在前面ABC1C2DE写在最后写在前面比赛地址:https://codeforces.com/contest/1942。过了这么长时间才来补太唐了、、、赛时写D写了一坨呃呃,用刷表法总是不可避免地要多枚举一个\(O(n)\)比较+转移妈的,赛后一看填表法+堆就不用枚举了笑烂了A签到。完全相等的数列随便......
  • Codeforces 1906H Twin Friends
    考虑到\(N\)的字符组成其实是固定的。所以可以把方案数拆为\(A\)的方案数\(\times\)\(A,B\)相匹配的方案数。对于\(A\)的方案数,就是多重集组合数,为\(\dfrac{n!}{\prod\limits_{i=0}^{25}(cnt_{A,i}!)}\)。接下来考虑求解\(A,B\)相匹配的方案数。考虑到对于......
  • 4.6Codeforces Global Round 25
    A题:DualTrigger题意:一个01字符串,每次只能选择俩不相邻的0,把他俩变成1(初始情况都是0)问你最后能不能把这个全0字符串,变成所要求的那样思路:首先分奇偶情况,试了几种情况发现,奇数个1是不可能的而对于偶数,也就只有一种情况是不行的:只有两个1并且最大的连续值就是2。实现:先把奇数......
  • 4.5Codeforces Round 905 (Div. 3)
    C题题意:几个数字,挑选其中几个进行+1.得到的数字的乘积可以整除k注意题目条件:k只能是2,3,4,5这几种情况每个数字只能是1——10(不算大)(好像没啥用,因为可以自增超过10)思路:对于2,3,5要想整除,这些个数里必须要有一个数是可以整除2,3,5的。所以思路很简单,去造,找到一个“变成5的倍数”所需......
  • 信息学奥赛一本通题目解析:1938:【07NOIP普及组】奖学金(排序)
    【题目描述】某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前55名学生发奖学金。期末,每个学生都有33门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学......