AT_abc200_f 题解
Melo.VVちゃん · · 题解
感觉糖糖的。
考虑一个确定的串的答案是极长
于是直接钦定开头字符,然后在每个极长段的开头计算贡献,以计算极长
然后发现对于在模
当第一个字符是
需要特判
f (i ,1 ,n ,1) pre[i] = pre[i - 1] + (ch[i] == '?') ;
int tot = pre[n] ;
auto Qpow = [] (int p ,int bs = 2) -> int {
if (p < 0) return 0 ;
p %= mod - 1 ;
int res = 1 ;
for (; p ; p >>= 1 ,bs = 1ll * bs * bs % mod)
(p & 1) && (res = 1ll * res * bs % mod) ;
return res ;
} ;
if (n == 1) {
if (ch[1] != '?') return std :: cout << "0\n" ,0 ;
else std :: cout << 2ll * ((1ll * (k - 2) * Qpow (k - 3) % mod + Qpow (k - 2)) % mod) % mod << '\n' ;
return 0 ;
}
if (ch[1] == '0') {
int ans = 0 ;
f (i ,2 ,n ,1) if (ch[i] != '0' && ch[i - 1] != '1')
(ans += Qpow (pre[i - 2] + tot * (k - 1) + pre[n] - pre[i]) % mod) %= mod ;
if (k > 1) f (i ,1 ,n ,1) if (ch[i] != '0' && ch[i == 1 ? n : i - 1] != '1') {
int coef = i == 1 ? pre[n - 1] : tot + pre[i - 2] ;
(ans += 1ll * (k - 1) * Qpow (coef + tot * (k - 2) + pre[n] - pre[i]) % mod) %= mod ;
} std :: cout << ans << '\n' ;
} else if (ch[1] == '1') {
int ans = 0 ;
f (i ,2 ,n ,1) if (ch[i] != '1' && ch[i - 1] != '0')
(ans += Qpow (pre[i - 2] + tot * (k - 1) + pre[n] - pre[i]) % mod) %= mod ;
if (k > 1) f (i ,1 ,n ,1) if (ch[i] != '1' && ch[i == 1 ? n : i - 1] != '0') {
int coef = i == 1 ? pre[n - 1] : tot + pre[i - 2] ;
(ans += 1ll * (k - 1) * Qpow (coef + tot * (k - 2) + pre[n] - pre[i]) % mod) %= mod ;
} std :: cout << ans << '\n' ;
} else {
std :: for_each (pre + 1 ,pre + n + 1 ,[] (int &i) -> void { i-- ;}) ;
int ans = 0 ;
ch[1] = '0' ; f (i ,2 ,n ,1) if (ch[i] != '0' && ch[i - 1] != '1')
(ans += Qpow (pre[i - 2] + tot * (k - 1) + pre[n] - pre[i]) % mod) %= mod ;
if (k > 1) f (i ,1 ,n ,1) if (ch[i] != '0' && ch[i == 1 ? n : i - 1] != '1') {
int coef = i == 1 ? pre[n - 1] : tot + pre[i - 2] ;
(ans += 1ll * (k - 1) * Qpow (coef + tot * (k - 2) + pre[n] - pre[i]) % mod) %= mod ;
}
ch[1] = '1' ; f (i ,2 ,n ,1) if (ch[i] != '1' && ch[i - 1] != '0')
(ans += Qpow (pre[i - 2] + tot * (k - 1) + pre[n] - pre[i]) % mod) %= mod ;
if (k > 1) f (i ,1 ,n ,1) if (ch[i] != '1' && ch[i == 1 ? n : i - 1] != '0') {
int coef = i == 1 ? pre[n - 1] : tot + pre[i - 2] ;
(ans += 1ll * (k - 1) * Qpow (coef + tot * (k - 2) + pre[n] - pre[i]) % mod) %= mod ;
} std :: cout << ans << '\n' ;
}