nyoj新生周赛(5)快乐的串串

卡了很久都没有思路的一道题(还是太菜了)
感谢cry和dzw学长的指点。

题目描述

当小羽拿着你的代码过五关斩六将之后, 心情非常激动.

于是乎那位机房的dalao就给他说,这有一个01串,当这个字串0和1的数量相等的时候这个子串是稳定的.

并且价值会随着长度增加而增加,现在小羽想知道这个字符串其中的子串在稳定的情况下最长的长度是多少.

输入格式

一行一个01字符串str

输出格式

最长稳定字串的长度

样例

样例输入

00001111

样例输出

8

数据范围与提示

01串长度<=1e6

周赛的时候我就是个铁头娃,除了遍历的方法脑子就是团糨糊
下去后我去问dzw学长,学长告诉我要找01的差值,然后笨比zmr写了一遍发现还是O(n^2)的复杂度,这就很尴尬
加上cry学长的专门指点和zmr的几天酝酿,终于有了思路
zmr笨比

#include<bits/stdc++.h>
using namespace std;
char a[1000005];
int b[2000005][2];
int main()
{
	int num=1000000,v,ans=0;
	scanf("%s",a);
	int l=strlen(a);
	b[1000000][0]=1;
	for(int i=0;i<l;i++)
	{
		if(a[i]=='1')
		{
			ans++;
		}
		if(a[i]=='0')
		{
			ans--;
		}
		if(b[ans+1000000][0]==0)
		{
			b[ans+1000000][0]=i+2;
		}
		else
		b[ans+1000000][1]=i+2;
	}
	int an,maxn;
	for(int i=0;i<2000005;i++)
	{
		if(b[i][0]==0 || b[i][1]==0)
		continue;
		else
		{
			an=b[i][1]-b[i][0];
			maxn=max(maxn,an);
		}
	}
	printf("%d",maxn);
}

就这就这???

第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛(同步赛)

B小宝的幸运数组

对于小宝来说,如果一个数组的总和能够整除他的幸运数字k,就是他的幸运数组,而其他数组小宝都很讨厌。现在有一个长度为n的数组,小宝想知道这个数组的子数组中,最长的幸运子数组有多长。

对于子数组的定义,如果可以通过从开头和从结束分别删除若干个(可以为零或全部,前后删除个数不必相同)元素来从数组b获得数组a,则称数组a是数组b的子数组。(子数组包含原数组,但不包含空串)

输入描述:
多组输入。第一行包含一个整数T(1≤T≤10),表示有T组测试数据。

每组测试数据包含两行,第一行包含两个整数n和k(1≤n≤1e5,1≤k≤1e5),分别表示数组长度和小宝的幸运数字。第二行包含n个空格分隔的整数a1,a2,.,an(0≤ai≤10^9),为数组的元素。

输出描述:
对于每组数据,输出和能被k整除的最长子数组的长度。如果没有这样的子数组,则输出−1。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
int a[maxn];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n,k,sum=0,x,ans=-1;
		scanf("%d%d",&n,&k);
		for(int i=0;i<k;i++)
		a[i]=-1;
		a[0]=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&x);
			sum=(sum+x)%k;
			if(a[sum]==-1)
			a[sum]=i;
			else
			ans=max(ans,i-a[sum]);
		}
		printf("%d\n",ans);
	}
} 

一个人可以傻成啥样?
一个坑掉进去的第二次

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值