Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

完全平等二国間貿易

サイバースペースにあるアイヅ国はワカマツ国と情報貿易を行っています。２つの国はお互いに有用なデータを交換することで経済発展を遂げています。博愛と平等、そして何よりも会津地方の古い言葉である、「ならぬことはならぬものです」を国是とする両国は、定期的に貿易状況の調査を行っています。

調査では、バイト単位でアイヅ国から見たデータ流入量から流出量を引いた値を、１ナノ秒ごとに求めた表が与えられます。その表から、値の総和が０になる最長の区間を見つけます。この区間が長いほど、平等性が保たれていると判断します。

貿易状況が記録された表が与えられたとき、値の総和が０になる最長の区間の長さを求めるプログラムを作成せよ。

Input

入力は以下の形式で与えられる。

N
d1
d2
:
dN

１行目に、表に書かれた値の数 N (1 ≤ N ≤ 200000) が与えられる。続く N 行に、表の i 行目に書かれた値を示す整数 di (-109 ≤ di ≤ 109) が与えられる。

Output

表から得られる、総和が０になる最長の区間の長さを１行に出力する。そのような区間が存在しない場合、「0」を１行に出力する。

Sample Input 1

5
18
102
-155
53
32

Sample Output 1

3

入力例１では、２行目から４行目までの値の総和が０になるので、最長の区間の長さが3になる。

Sample Input 2

4
1
1
-1
-1

Sample Output 2

4

入力例２では、２行目から３行目の総和が０になるが、１行目から４行目までの値の総和も０になるので、最長の区間の長さが4になる。

Solution in C# (judge verdict: Accepted)

using System.Collections.Generic;
using System;

public class hello
{
    public static void Main()
    {
        var n = int.Parse(Console.ReadLine().Trim());
        var a = new long[n + 1];
        for (int i = 0; i < n; i++)
            a[i + 1] = a[i] + long.Parse(Console.ReadLine().Trim());
        var d = new Dictionary<long, int>();
        var ans = -1L;
        for (int i = 0; i <= n; i++)
        {
            if (d.ContainsKey(a[i]) ) ans = Math.Max(ans, i - d[a[i]]);
            else d[a[i]] = i;
        }
        if (ans == -1  ) Console.WriteLine(0);
        else  Console.WriteLine(ans);
    }
}