题解:P15879 [ICPC 2026 NAC] Evil Judges

· · 题解

Upd

5.10 初稿。

思路

观察发现交换 s_is_{i+1} 只会影响 s_is_{i-1} 这个子序列。因此答案即为操作 0 次时的序列中剩余合法的子序列的数量 -M

注意因为操作 0 次时的序列中剩余合法的子序列的数量可能爆 int,所以要开 long long。

代码注释:

# AC Code ```cpp #include<bits/stdc++.h> using namespace std; string s; long long M,A[200000],C[200000],K[200000],cnt,i; int main(){ cin>>s>>M; if(s[0]=='A') A[0]=1; else if(s[0]=='C') C[0]=1; else K[0]=1; for(i=1;i<s.length();i++){ if(s[i]=='A') A[i]=1; else if(s[i]=='C') C[i]=1; else K[i]=1; A[i]+=A[i-1]; C[i]+=C[i-1]; K[i]+=K[i-1]; } for(i=0;i<s.length()-1;i++) if(s[i]=='A') cnt+=C[s.length()-1]-C[i]+K[s.length()-1]-K[i]; if(cnt-M>0) cout<<cnt-M; else cout<<0; return 0; } ```