题目链接: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; const int maxn = ;
char str[maxn];
int t[maxn], s[maxn];
map<int, int> pos;
int n; int main() {
// freopen("in", "r", stdin);
while(~scanf("%s", str)) {
n = strlen(str);
memset(s, , sizeof(s));
pos.clear();
for(int i = ; i <= n; i++) {
if(str[i-] == '') t[i] = ;
if(str[i-] == '') t[i] = -;
s[i] = s[i-] + t[i];
}
int ret = ;
for(int i = ; i <= n; i++) {
if(s[i] == ) ret = max(ret, i);
if(pos.find(s[i]) == pos.end()) pos[s[i]] = i;
else {
ret = max(ret, i-pos[s[i]]);
}
}
printf("%d\n", ret);
}
return ;
}