题意: 解法: 根据题目要求,aa不能出现,aba也不能出现, 那么任意三个连续字符,一定两两不同, 此时只需要确定前三个字符,那么后面的所有字符都是确定的. 枚举前三个字符的变化组合, 对于第num种组合,计算出sum[num][i]表示 [1,i]变化了多少次. 对于每组询问,枚举组合i,那么min{sum[i][r]-sum[i][l-1]}就是答案. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=2e6+5; int sum[10][maxm]; char s[maxm]; int n,m; void solve(){ cin>>n>>m; cin>>(s+1); int num=0; for(auto i:{'a','b','c'}){ for(auto j:{'a','b','c'}){ for(auto k:{'a','b','c'}){ if(i!=j&&i!=k&&j!=k){ num++; for(int x=1;x<=n;x++){ sum[num][x]=sum[num][x-1]; if(x%3==1)sum[num][x]+=(s[x]!=i); else if(x%3==2)sum[num][x]+=(s[x]!=j); else if(x%3==0)sum[num][x]+=(s[x]!=k); } } } } } while(m--){ int l,r;cin>>l>>r; int ans=1e9; for(int i=1;i<=num;i++){ ans=min(ans,sum[i][r]-sum[i][l-1]); } cout<<ans<<endl; } } signed main(){ ios::sync_with_stdio(0);cin.tie(0); solve(); return 0; }