1393 0和1相等串 51nod

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<cstdio>
#include<cmath>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
#include<deque>
#include<iomanip>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<fstream>
#include<memory>
#include<list>
#include<string>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
#define MAXN 1000009
#define N 21
#define MOD 1000000
#define INF 1000000009
const double eps = 1e-8;
const double PI = acos(-1.0);
/*
如果 从位置i 到位置j是一段 01相等子串
设 n0[] 为0的数目,n1为1的数目
那么有 n1[i] - n1[j] == n0[i] - n0[j]
整理可得  n1[i] - n0[i] == n1[j] - n0[j]
那么可以记录路径上所有n1[i] - n0[i]的值(map,hash)
当后面重复 该值(出现相等子串) 可以取最大值
*/
map<int, int> M;
char s[MAXN];
int n1[MAXN], n0[MAXN];
int main()
{
    int l, ans = 0;
    scanf("%s", s);
    l = strlen(s);
    if (s[0] == ‘1‘)
        n1[0] = 1, n0[0] = 0;
    else
        n0[0] = 1, n1[0] = 0;
    M[n1[0] - n0[0]] = 0;
    M[0] = -1;
    for (int i = 1; i < l; i++)
    {
        if (s[i] == ‘1‘)
            n1[i] = n1[i - 1] + 1, n0[i] = n0[i - 1];
        else
            n0[i] = n0[i - 1] + 1, n1[i] = n1[i - 1];
        if (M.find(n1[i] - n0[i]) == M.end())
            M[n1[i] - n0[i]] = i;
        else
            ans = max(ans, i - M[n1[i] - n0[i]]);
    }
    printf("%d\n", ans);
}
时间: 2024-11-05 11:35:55

1393 0和1相等串 51nod的相关文章

51nod 1393 1393 0和1相等串

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1393 当0和1的数量差值为0时,进行记录和ans进行比较,其他的,差值相等时,0和1的数量一定相等.用后面的减前面的情况. #include<bits/stdc++.h> using namespace std; char s[1000005]; int a[1000005],b[1000005]; map<int,int>m; main() { int

51nod 1393 0和1相等串 思路 : map存前缀和

题目: 思路:把'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; //存前缀和最早出现的位置 int a[1000001]; //数字数

AC日记——还是01串 51nod 1396

还是01串 思路: 前缀和: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 1000005 int n,sum[maxn]; char ch[maxn]; int main() { gets(ch),n=strlen(ch); for(int i=0;i<n;i+

串的堆分配存储表示与实现--自己写数据结构

本次实现的数据结构是关于串的表示与实现,首先讲串的堆分配存储表示与实现,后面的博客将贴出串的另外数据结构的表示和实现 heapstring.h文件存放数据结构体,如下 #ifndef _HEAPSRING_H_ #define _HEAPSRING_H_ typedef struct _HString { char *ch; int length; }HString,*pHString; pHString init_null_string(void); pHString init_heap_st

第四章:2.串 -- 串的模式匹配算法(KMP)

前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 串的模式匹配算法 主串 S: a b c a b c d s v t 子串 T: a b c d 一.原始算法 匹配一旦失败,子串即向右移动一个单位,直到完全匹配停止. 第一次匹配:(注:红色代表不匹配(失配)) S: a b c a b c a b c d s v t   T: a b c d

java 11-8 在大串中查找小串的案例

1.统计大串中小串出现的次数 举例: 在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun" 结果: java出现了5次 分析: 1.首先已经知道字符串 A:定义一个统计变量=0: B:在大串中查找小串是否存在,用 int indexOf(String str):返回指定字符在此字符串中第一次出现处的索引. a:如果返回的索引值是-1,则说明 大串中并不存在这个小串,输出统计变量 b:返回

回文串和镜像串(摘)

#include<iostream> #include<stdio.h> #include<string.h> #include<ctype.h> const char* rev="A 3 HIL JM O 2TUVWXY51SE Z 8 "; //前26项为各个大写字母的镜像,后10个是数字1至9的镜像(不输入数字0) const char* msg[]={"not a palindrome","a reg

深度学习与计算机视觉系列(9)_串一串神经网络之动手实现小例子

作者:寒小阳&&龙心尘 时间:2016年1月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/50521072 声明:版权所有,转载请联系作者并注明出处 1.引言 前面8小节,算从神经网络的结构.简单原理.数据准备与处理.神经元选择.损失函数选择等方面把神经网络过了一遍.这个部分我们打算把知识点串一串,动手实现一个简单的2维平面神经网络分类器,去分割平面上的不同类别样本点.为了循序渐进,我们打算先实现一个简单的线性分类器,然后再拓

数据结构 - 串的性质和基本操作(一)

串的概念 什么是串呢? 串(String):由零个或多个字符组成的有限序列.记为:s='a1a2-an'(n≥0) s为串名, 'a1a2-an'为串值,n为串的长度. 子串在主串中的位置:以子串的第一个字符在主串中的位置来表示 串相等:当且仅当两个串的串值相等(两个串的长度相等,并且各个对应的字符也都相等 串的数据类型 ADT String { D={ ai |ai∈CharacterSet, i=1,2,...,n, n≥0 } R={ < ai-1, ai > | ai-1, ai ∈D