TopCoder SRM650 Div1 Easy TaroFillingAStringDiv1

問題文

概要

$N$ 文字の, 各文字が AB からなる文字列で, 同じ文字が $2$ 文字連続している箇所をなるべく少なくしたい. position[i] 番目の文字が value[i] であるという制約の下, 連続している箇所が最も少なくなるような文字列のパターン数を $\mathrm{mod}\ 1000000007$ で答えよ.

制約

$N \le 10^9$, $\mathrm{position.size()} \le 50$.

解法

指定を position でソート. 隣合う指定の差の偶奇と, 指定された文字の一致不一致を見ると, そこを連続する箇所 $0$ で埋められるか, $1$ 必要かが解る. $0$ の時は $1$ パターン, そうでない時は, どこで連続させるかで, position の差くらい.

ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int TaroFillingAStringDiv1::getNumber( int N, vector <int> position, string value ){
    const long long mod = 1000000007;
    vector<pair<int, char>> in;
    rep(i, size(position)) in.emplace_back(position[i], value[i]);
    sort(begin(in), end(in));
    long long res = 1;
    rep(i, size(in)-1){
        if(((in[i+1].fst-in[i].fst)%2 == 0) ^ (in[i+1].snd == in[i].snd)){
            res *= in[i+1].fst-in[i].fst;
            res %= mod;
        }
    }
    return res;
}