C.ユージーンと配列(プレフィックスとマップ)

タイトルポータル

トピック:連続する部分文字列の場合、合計が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;

}

公開された93元の記事 ウォンの賞賛9 ビュー4203

おすすめ

転載: blog.csdn.net/Joker_He/article/details/105422454