JZOJ__Day 2:【普及模拟】串

本文介绍了一种算法,用于从给定的0-1字符串中找出最长的子串,该子串内0和1的数量相等。通过遍历字符串并跟踪0和1数量的变化,可以有效地解决问题。
题目描述
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
输入
一个字符串,只包含01,长度不超过1000000。
输出
一行一个整数,最长的0与1的个数相等的子串的长度。
样例输入
1011
样例输出
2
数据范围限制

30%的数据 串的长度<20



程序:

        

var
s:ansistring;
i,j,min,max,p,l:longint;
min1,max1:array[-1000001..1000001]of longint;
begin
    fillchar(min1,sizeof(min1),127);
    min1[0]:=0;
    readln(s);
    min:=maxlongint;
    p:=0;
    max:=0;
    for i:=1 to length(s) do
    if s[i]='1' then
    begin
        inc(p);
        if p>max then max:=p;
        if p<min then min:=p;
        if i<min1[p] then min1[p]:=i;
        if i>max1[p] then max1[p]:=i;
    end else
    begin
        dec(p);
        if p>max then max:=p;
        if p<min then min:=p;
        if i<min1[p] then min1[p]:=i;
        if i>max1[p] then max1[p]:=i;
    end;
    for i:=min to max do
    if l<max1[i]-min1[i] then l:=max1[i]-min1[i];
    write(l);
end.


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值