C. Good Subarrays(思维)

 C. Good Subarrays(思维)_第1张图片

如果有一段字符串数字之和为其长度,那么成这个字符串为 good

给出一个字符串,问有多少字串满足 

一上来我就想出了一个 O(n^2) 的做法(不愧是我) ,然后不出意外 T 了

超时代码: 

const int N=1e5+5;
 
    int n,m,t;
    int i,j,k;
    int a[N];
    int sum[N];
    
int main()
{
    //IOS;
    rush(){
        sd(n);
        for(i=1;i<=n;i++) scanf("%1d",&a[i]);
        for(i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];
        int ans=0;
        for(i=1;i<=n;i++){
            for(j=1;j<=i;j++){
                if(sum[i]-sum[j-1]==i-j+1) ans++;
            }
        }
        cout<

我们将所有的字符都减小 1

这样只要找出一段字串为 0 即可

有桶排的方式存储之前出现的前缀和,若之后再出现,减去即可

AC 代码: 

const int N=1e5+5;
 
    int n,m,t;
    int i,j,k;
    int a[N];
    map mp;
    
int main()
{
    //IOS;
    rush(){
        sd(n);
        for(i=1;i<=n;i++) scanf("%1d",&a[i]),a[i]-=1;
        int sum=0;
        ll ans=0;
        mp.clear();
        for(i=1;i<=n;i++){
            sum+=a[i];
            if(sum==0) ans++;
            if(mp.count(sum)) ans+=mp[sum];
            mp[sum]++;
        }
        pll(ans);
    }
    //PAUSE;
    return 0;
}

 

 

你可能感兴趣的:(CF)