• 51nod 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的个数的差值相等。所以对于每一个字符,看之前这个差值有没有相同的,有相同的就取看能否够得着最大值。没有则标记一下。O(n)。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <string>
    #include <cstring>
    #pragma warning(disable:4996)
    using namespace std;
    
    int sum0[1000000];
    int sum1[1000000];
    int diff[1000000];
    
    int main()
    {
    	memset(diff, -1, sizeof(diff));
    	string test;
    	cin >> test;
    	
    	int i, max_v = 0;
    	int len = test.length();
    	
    	sum0[0] = 0;
    	sum1[0] = 0;
    
    	if (test[0] == '0')
    	{
    		sum0[i] = 1;
    		sum1[i] = 0;
    	}
    	else
    	{
    		sum1[i] = 1;
    		sum0[i] = 0;
    	}
    
    	for (i = 1; i < len; i++)
    	{
    		if (test[i] == '0')
    		{
    			sum0[i] = sum0[i - 1] + 1;
    			sum1[i] = sum1[i - 1];
    		}
    		else
    		{
    			sum1[i] = sum1[i - 1] + 1;
    			sum0[i] = sum0[i - 1];
    		}
    		if (diff[sum1[i] - sum0[i] + 500000] == -1)
    		{
    			diff[sum1[i] - sum0[i] + 500000] = i;
    		}
    		else 
    		{
    			max_v = max(max_v, i - diff[sum1[i] - sum0[i] + 500000]);
    		}
    		if (sum1[i] == sum0[i])
    		{
    			max_v = max(max_v, i + 1);
    		}
    	}
    	cout << max_v << endl;
    
    	return 0;
    }
    



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    asp.net
    深度优先遍历
    计算机存储体系
    CPU 进程 线程 关系与区别
    OLAP、OLTP的介绍和比较
    几种消息队列对比
    协议那些事(四)
    协议那些事(三)
    协议那些事(二)
    协议那些事(一)
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4899602.html
Copyright © 2020-2023  润新知