Beautiful Bracket Sequence (hard version)
题意:给出一个包含 ( ) ? ()? ()?的字符串,求将 ? ? ?变为 ( ) () ()之一的所有方案中,字符串的深度和。深度 d d d为其子序列中最长的为 2 ∗ d 2*d 2∗d的字符串其中前 d d d位都是 ( ( (后 d d d位都是 ) ) )。
发现一个性质这题就很好做了。
对于一个只有 ( ) () ()的字符串,一定只有一个点 x x x,满足它左边 1... x 1...x 1...x的左括号数等于 x + 1... n x+1...n x+1...n的右括号数,并且这个字符串的深度就是它左边的左括号数。
那么我们枚举每个位置 x x x,假设左边有 a a a个左括号,有 c c c个问号,右边有 y y y个右括号, z z z个问号。
则答案为 ∑ i = max ( a , y ) min ( a + c , y + z ) i ( c i − a ) ( z i − y ) \sum_{i=\max(a,y)}^{\min(a+c,y+z)}i\binom{c}{i-a}\binom z{i-y} ∑i=max(a,y)min(a+c,y+z)i(i−ac)(i−yz)
发现因为组合数下标为0或者大于上标都为 0 0 0,可以把式子写成枚举范围易于范德蒙德卷积的形式:
∑ i i ( c i − a ) ( z z + y − i ) = ∑ ( i − a ) ( c i − a ) ( z z + y − i ) + a ∑ ( c i − a ) ( z z + y − i ) \sum_i i \binom c{i-a} \binom z{z+y-i} = \sum (i-a)\binom c{i-a} \binom z{z+y-i} + a\sum \binom c{i-a} \binom z{z+y-i} ∑ii(i−ac)(z+y−iz)=∑(i−a)(i−ac)(z+y−iz)+a∑(i−ac)(z+y−iz)
= ∑ c ( c − 1 i − a − 1 ) ( z z + y − i ) + a ( c + z z + y − a ) =\sum c\binom {c-1}{i-a-1}\binom z{z+y-i} + a \binom {c+z}{z+y-a} =∑c(i−a−1c−1)(z+y−iz)+a(z+y−ac+z)
= c ( c + z − 1 z + y − a − 1 ) + a ( c + z z + y − a ) = c\binom {c+z-1}{z+y-a-1} + a\binom {c+z}{z+y-a} =c(z+y−a−1c+z−1)+a(z+y−ac+z)
A C C o d e \mathcal AC \ Code AC Code
#include<bits/stdc++.h>
#define maxn 1000006
#define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i++)
#define mod 998244353
using namespace std;
int n,fac[maxn],inv[maxn],invf[maxn];
char s[maxn];
int C(int a,int b){
if(a<0||b<0||a<b) return 0;return fac[a] * 1ll * invf[b] % mod * invf[a-b] % mod; }
int main(){
scanf("%s",s);
n=strlen(s);
fac[0]=fac[1]=inv[0]=inv[1]=invf[0]=invf[1]=1;
rep(i,2,n) fac[i] = 1ll * fac[i-1] * i % mod , inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod,
invf[i] = 1ll * invf[i-1] * inv[i] % mod;
int a=0,c=0,y=0,z=0;
rep(i,0,n-1){
if(s[i] == ')') y++;
if(s[i] == '?') z++;
}
int ans = 0;
rep(i,0,n-1){
if(s[i] == '(') a ++;
else if(s[i] == ')') y --;
else c ++ , z -- ;
ans = (ans + 1ll * a * C(z+c,z+y-a) + 1ll * c * C(z+c-1,z+y-a-1)) % mod;
}
printf("%d\n",(ans+mod)%mod);
}
CF1286D LCC
数轴上有 n n n个粒子,每个有 v i v_i vi的初速度,有<