2 条题解

  • 0
    @ 2026-8-5 16:23:08
    #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
      @ 2026-8-5 14:34:56

      观察样例,发现所有相邻两个字母相同的情况都会被统计进去,所以将前面那个字符的下表上打上 tagtag,因为区间统计,所以跑一边前缀和就行。

      但这样过不了样例一,因为会存在右端点刚好被打了标记,此时右端点的标记是无效的,减去即可。

      代码:

      #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
      上传者