タイトルポータル
トピック:連続する部分文字列の場合、合計が0の部分文字列はありません。この部分文字列が適切であるとしましょう。適切な文字列の数を見つけるための配列を提供してください。
アイデア: [j]〜a [k]の合計が0であり、j <k <= iであると仮定して、[i]で[i]で終わるiサブストリングがあるとします。[i]で終わるijの有効な部分文字列のみがあります。接頭辞の合計を扱い、mapを使用して接頭辞とそれが出現する位置を記録します。iに最も近いものを0のサブストリングとして処理するだけで済みます。
コード:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
const int inf=0x7fffffff;
const int mod=1e9+7;
const int eps=1e-6;
typedef long long ll;
typedef unsigned long long ull;
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
#define null NULL
int a[N];
signed main()
{
IOS;
int n;
cin>>n;
map<int,int>ma;
int s=0;
ma[0]=0;
int q=-1;
int ans=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s+=a[i];
if(ma[s]||s==0)
q=max(q,ma[s]);
ans+=i-q-1;
ma[s]=i;
}
cout<<ans<<endl;
}