赞
踩
如果有一段字符串数字之和为其长度,那么成这个字符串为 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<<ans<<endl;
- }
- //PAUSE;
- return 0;
- }
我们将所有的字符都减小 1
这样只要找出一段字串为 0 即可
有桶排的方式存储之前出现的前缀和,若之后再出现,减去即可
AC 代码:
- const int N=1e5+5;
-
- int n,m,t;
- int i,j,k;
- int a[N];
- map<int,int> 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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。