1. 程式人生 > 其它 >題解 - CF 873B. Balanced Substring

題解 - CF 873B. Balanced Substring

873B. Balanced Substring

思路

設'1' = '1' , '0' = '-1', 用sum記錄字首和,用pos陣列記錄a陣列中字首和等於k的第一個位置,因為字首和表示1和0的個數差,當sum[a] == sum[b], (a,b]中的0和1的個數一定相同。

程式碼

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
//#define for (i, a, b) for (int i = a; i <= b; ++i)
const int N = 100004;
#define INF 0x3f3f3f3f
int n, a[N], pos[2 * N], sum[N], ans;
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%1d", a + i); //只讀一個字元並將字元作為數字讀入。

    memset(pos, INF, sizeof(pos));
    pos[N] = 0; // 因為pos[0]在一個都不取時為0,注意這個初始化。
    for (int i = 1; i <= n; ++i)
    {
        sum[i] = sum[i - 1] + (a[i] ? 1 : -1); //因為運算優先順序,要加括號。
        if (pos[sum[i] + N] == INF)
            pos[sum[i] + N] = i; //記錄初始位置
        else
            ans = max(i - pos[sum[i] + N], ans);
    }
    printf("%d\n", ans);
    for(int i = 1; i <= n; ++i)
        printf("%d ", sum[i]);
    return 0;
}