题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1393 题意:中文题面. 把0看成是-1,并且存一遍前缀和.这样-1和1相等数量的时候前缀和为0,这个特判一次.还有就是区间[l,r]和为0的时候的充要条件是s[r]-s[l]=0,得解. #include <bits/stdc++.h> using namespace std; ; char str[maxn]; int t[maxn], s[maxn];…
1393 0和1相等串 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等. Input 一个字符串,只包含01,长度不超过1000000. Output 一行一个整数,最长的0与1的个数相等的子串的长度. Input示例 1011 Output示例 2 起点和终点的关系整理一下,有时候可以得到一种hash的思路. #include<iostream> #include<…
1393 0和1相等串 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等. Input 一个字符串,只包含01,长度不超过1000000. Output 一行一个整数,最长的0与1的个数相等的子串的长度. Input示例 1011 Output示例 2 记录每一个字符时所含有的1个个数与0的个数,一个字串包含的0和1的个数相等,就是首尾处1的个数与0的个数的差值相等.所以对于…
题目: 思路:把'0'当成数字-1,'1'当成数字1,求前缀和,用map更新当前前缀和最早出现的位置.(用map而不用数组是因为可能会出现负数) 当前缀和的值之前出现过,比如i = 10时,sum = 0:j = 50时,sum = 0; 更新ans = max(ans,j-i): 下面是一个例子: 代码: #include <bits\stdc++.h> using namespace std; map<int,int> m; //存前缀和最早出现的位置 ]; //数字数组 in…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1393 正解一眼看出来的应该是鸽笼原理.记录每个位置的前缀和,就是dp[i][1]表示前i个数中,1的个数.dp[i][0]同理. 然后计算出每一个位置的dp[i][1] - dp[i][0],如果和前面的出现相同,那么这一段就是贡献. 也可以从化简dp公式来看. 也是一样的都dp[i][0] && dp[i][1] 那么设区间为be, en 如果要相同,则需要dp…
How to remove the return code from the terminal prompt In addition to the PS1 environment variable, the PROMPT_COMMAND environment variable also affects your prompt. From the bash man page: If set, the value is executed as a command prior to issuing…
这是2013年长春区域赛的铜牌题...然而第一次做的时候一直觉得会超时的..最后才知道并没有想象中的那么恐怖: 这题有两个注意的地方: (1)h[i] = h[i-1] * seed + s[i] - 'a' + 1;防止ab和aab的hash值相同:(后来感觉没必要,因为都是长度相等的串,但是长度不等的串就要注意了,所以还是写在这里吧): (2)unsigned long long 会自动取模.所以即使乘上1e5次也不会爆orz..这是组成原理的内容了..我也是从别的大神那里听来的: 这到题的…
Problem Description由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串?答案mod2008.例如,100100不是本原串,因为他是由两个100组成,而1101是本原串. Input输入包括多个数据,每个数据一行,包括一个整数n,代表串的长度. Output对于每个测试数据,输出一行,代表有多少个符合要求本原串,答案mod2008. Sample Input1234 Sample Output22612 长…
题目链接:http://codeforces.com/problemset/problem/1006/C (CSDN又改版了,复制粘贴来过来的题目没有排版了,好难看,以后就截图+题目链接了) 题目截图: 题意:一个长度为n的数组,按顺序分成三部分,要求第一部分和第三部分元素的和相等(每一部分都可以没有元素,没有元素的部分元素和为0),求出第一部分和第三部分最大的相等的元素和,如果没有输出0 实现:开两个数组记录下数组的前缀和,后缀和(不知道这样叫对不对),然后用map记录下每个前缀和,后缀和指向…
设sj,so,si分别是J O I的个数前缀和,然后要求求最长(l,r)满足sj[r]-sj[l-1]==so[r]-so[l-1]==si[r]-si[l-1],化简一下就是满足so[r]-so[l-1]-(sj[r]-sj[l-1)-(si[r]-si[l-1]-(so[r]-so[l-1))==0,把这个搞成一个pair用map记录最早出现位置然后更新ans即可 注意因为是前缀和相减,所以0位置也要加进map #include<iostream> #include<cstdio&g…