2 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N=3e5+10; int A[N]; char s[N]; int main(){ int n, q;scanf("%d%d%s",&n,&q,s+1); A[1] = 0; for(int i = 2;i <= n;i++) if(s[i-1] == s[i])A[i] = A[i-1] + 1; else A[i] = A[i-1]; for(int i = 0,x,y;i < q;i++){ scanf("%d%d",&x,&y); printf("%d\n",A[y]- A[x]); } return 0; } -
0
观察样例,发现所有相邻两个字母相同的情况都会被统计进去,所以将前面那个字符的下表上打上 ,因为区间统计,所以跑一边前缀和就行。
但这样过不了样例一,因为会存在右端点刚好被打了标记,此时右端点的标记是无效的,减去即可。
代码:
#include<bits/stdc++.h> using namespace std; int flag[355555]; int main(){ int n,q; cin>>n>>q; string s; cin>>s; s="#"+s; for(int i=1;i<n;i++){ if(s[i]==s[i+1]){ flag[i]=1; } } for(int i=1;i<=n;i++){ flag[i]+=flag[i-1]; } while(q--){ int l,r; cin>>l>>r; int ans=flag[r]-flag[l-1]; if(r!=n && s[r]==s[r+1]){ ans--; } cout<<ans<<"\n"; } return 0; }
- 1
信息
- ID
- 8313
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 6
- 标签
- 递交数
- 37
- 已通过
- 12
- 上传者