当前位置:   article > 正文

C. Good Subarrays(思维)

c. good subarrays

 

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

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

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

超时代码: 

  1. const int N=1e5+5;
  2. int n,m,t;
  3. int i,j,k;
  4. int a[N];
  5. int sum[N];
  6. int main()
  7. {
  8. //IOS;
  9. rush(){
  10. sd(n);
  11. for(i=1;i<=n;i++) scanf("%1d",&a[i]);
  12. for(i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];
  13. int ans=0;
  14. for(i=1;i<=n;i++){
  15. for(j=1;j<=i;j++){
  16. if(sum[i]-sum[j-1]==i-j+1) ans++;
  17. }
  18. }
  19. cout<<ans<<endl;
  20. }
  21. //PAUSE;
  22. return 0;
  23. }

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

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

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

AC 代码: 

  1. const int N=1e5+5;
  2. int n,m,t;
  3. int i,j,k;
  4. int a[N];
  5. map<int,int> mp;
  6. int main()
  7. {
  8. //IOS;
  9. rush(){
  10. sd(n);
  11. for(i=1;i<=n;i++) scanf("%1d",&a[i]),a[i]-=1;
  12. int sum=0;
  13. ll ans=0;
  14. mp.clear();
  15. for(i=1;i<=n;i++){
  16. sum+=a[i];
  17. if(sum==0) ans++;
  18. if(mp.count(sum)) ans+=mp[sum];
  19. mp[sum]++;
  20. }
  21. pll(ans);
  22. }
  23. //PAUSE;
  24. return 0;
  25. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/180290
推荐阅读
  

闽ICP备14008679号