func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T, typename U>   std::istream& operator>>(std::istream& i, pair<T, U>& p) {     i >> p.first >> p.second;     return i;   }   template <typename T>   std::istream& operator>>(std::istream& i, vector<T>& t) {     for (auto& v : t) {       i >> v;     }     return i;   }   template <typename T, typename U>   std::ostream& operator<<(std::ostream& o, const pair<T, U>& p) {     o << p.first <<     << p.second;     return o;   }   template <typename T>   std::ostream& operator<<(std::ostream& o, const vector<T>& t) {     if (t.empty()) o <<   n ;     for (size_t i = 0; i < t.size(); ++i) {       o << t[i] <<    n [i == t.size() - 1];     }     return o;   }   template <typename T>   using minheap = priority_queue<T, vector<T>, greater<T>>;   template <typename T>   using maxheap = priority_queue<T, vector<T>, less<T>>;   template <typename T>   bool in(T a, T b, T c) {     return a <= b && b < c;   }   unsigned int logceil(int first) {     return 8 * sizeof(int) - __builtin_clz(first);   }   namespace std {   template <typename T, typename U>   struct hash<pair<T, U>> {     hash<T> t;     hash<U> u;     size_t operator()(const pair<T, U>& p) const {       return t(p.first) ^ (u(p.second) << 7);     }   };   }  // namespace std   template <typename T, typename F>   T bsh(T l, T h, const F& f) {     T r = -1, m;     while (l <= h) {       m = (l + h) / 2;       if (f(m)) {         l = m + 1;         r = m;       } else {         h = m - 1;       }     }     return r;   }   template <typename F>   double bshd(double l, double h, const F& f, double p = 1e-9) {     unsigned int r = 3 + (unsigned int)log2((h - l) / p);     while (r--) {       double m = (l + h) / 2;       if (f(m)) {         l = m;       } else {         h = m;       }     }     return (l + h) / 2;   }   template <typename T, typename F>   T bsl(T l, T h, const F& f) {     T r = -1, m;     while (l <= h) {       m = (l + h) / 2;       if (f(m)) {         h = m - 1;         r = m;       } else {         l = m + 1;       }     }     return r;   }   template <typename F>   double bsld(double l, double h, const F& f, double p = 1e-9) {     unsigned int r = 3 + (unsigned int)log2((h - l) / p);     while (r--) {       double m = (l + h) / 2;       if (f(m)) {         h = m;       } else {         l = m;       }     }     return (l + h) / 2;   }   template <typename T>   T gcd(T a, T b) {     if (a < b) swap(a, b);     return b ? gcd(b, a % b) : a;   }   template <typename T>   class vector2 : public vector<vector<T>> {    public:     vector2() {}     vector2(size_t a, size_t b, T t = T())         : vector<vector<T>>(a, vector<T>(b, t)) {}   };   template <typename T>   class vector3 : public vector<vector2<T>> {    public:     vector3() {}     vector3(size_t a, size_t b, size_t c, T t = T())         : vector<vector2<T>>(a, vector2<T>(b, c, t)) {}   };   template <typename T>   class vector4 : public vector<vector3<T>> {    public:     vector4() {}     vector4(size_t a, size_t b, size_t c, size_t d, T t = T())         : vector<vector3<T>>(a, vector3<T>(b, c, d, t)) {}   };   template <typename T>   class vector5 : public vector<vector4<T>> {    public:     vector5() {}     vector5(size_t a, size_t b, size_t c, size_t d, size_t e, T t = T())         : vector<vector4<T>>(a, vector4<T>(b, c, d, e, t)) {}   };   template <unsigned int N>   class Field {     inline unsigned int pow(unsigned int a, unsigned int p) {       unsigned int r = 1, e = a;       while (p) {         if (p & 1) {           r = ((unsigned long long)r * e) % N;         }         e = ((unsigned long long)e * e) % N;         p >>= 1;       }       return r;     }     inline unsigned int inv(unsigned int a) { return pow(a, N - 2); }       public:     inline Field(int first = 0) : v(first) {}     inline Field<N> pow(int p) { return (*this) ^ p; }     inline Field<N> operator^(int p) { return {(int)pow(v, (unsigned int)p)}; }     inline Field<N>& operator+=(const Field<N>& o) {       if ((long long)v + o.v >= N)         v += o.v - N;       else         v += o.v;       return *this;     }     inline Field<N>& operator-=(const Field<N>& o) {       if (v < o.v)         v -= o.v - N;       else         v -= o.v;       return *this;     }     inline Field<N>& operator*=(const Field<N>& o) {       v = (unsigned long long)v * o.v % N;       return *this;     }     inline Field<N>& operator/=(const Field<N>& o) { return *this *= inv(o.v); }     inline Field<N> operator+(const Field<N>& o) const {       Field<N> r{*this};       return r += o;     }     inline Field<N> operator-(const Field<N>& o) const {       Field<N> r{*this};       return r -= o;     }     inline Field<N> operator*(const Field<N>& o) const {       Field<N> r{*this};       return r *= o;     }     inline Field<N> operator/(const Field<N>& o) const {       Field<N> r{*this};       return r /= o;     }     inline Field<N> operator-() {       if (v)         return {(int)(N - v)};       else         return {0};     };     inline Field<N>& operator++() {       ++v;       if (v == N) v = 0;       return *this;     }     inline Field<N> operator++(int) {       Field<N> r{*this};       ++*this;       return r;     }     inline Field<N>& operator--() {       --v;       if (v == -1) v = N - 1;       return *this;     }     inline Field<N> operator--(int) {       Field<N> r{*this};       --*this;       return r;     }     inline bool operator==(const Field<N>& o) const { return o.v == v; }     inline bool operator!=(const Field<N>& o) const { return o.v != v; }     inline explicit operator unsigned int() const { return v; }     inline static vector<Field<N>> fact(int t) {       vector<Field<N>> F(t + 1, 1);       for (int i = 2; i <= t; ++i) {         F[i] = F[i - 1] * i;       }       return F;     }     inline static vector<Field<N>> invfact(int t) {       vector<Field<N>> F(t + 1, 1);       Field<N> X{1};       for (int i = 2; i <= t; ++i) {         X = X * i;       }       F[t] = 1 / X;       for (int i = t - 1; i >= 2; --i) {         F[i] = F[i + 1] * (i + 1);       }       return F;     }       private:     unsigned int v;   };   template <unsigned int N>   istream& operator>>(std::istream& is, Field<N>& f) {     unsigned int v;     is >> v;     f = v;     return is;   }   template <unsigned int N>   ostream& operator<<(std::ostream& os, const Field<N>& f) {     return os << (unsigned int)f;   }   template <unsigned int N>   Field<N> operator+(int i, const Field<N>& f) {     return Field<N>(i) + f;   }   template <unsigned int N>   Field<N> operator-(int i, const Field<N>& f) {     return Field<N>(i) - f;   }   template <unsigned int N>   Field<N> operator*(int i, const Field<N>& f) {     return Field<N>(i) * f;   }   template <unsigned int N>   Field<N> operator/(int i, const Field<N>& f) {     return Field<N>(i) / f;   }   struct Ring {     static int div(int p, int q, int N) {       long long t = 0, nt = 1, r = N, nr = q;       while (nr) {         long long q = r / nr;         t -= q * nt;         r -= q * nr;         swap(t, nt);         swap(r, nr);       }       t = (t < 0) ? t + N : t;       r = (r < 0) ? r + N : r;       if (gcd(p, N) % r) {         return 0;       }       return (int)(((long long)t * (long long)p / r) % N);     }   };   template <typename T>   struct Fenwick {     explicit Fenwick(unsigned int N = 0, T t = T())         : N(1u << logceil(N)), F(this->N, t), t(t) {}     explicit Fenwick(const vector<T>& A, T t = T())         : N(1u << logceil(A.size())), F(A), t(t) {       F.resize(N);       fill(F.begin() + A.size(), F.end(), t);       for (int i = 0; i < N; i++) {         int j = i + lsb(i + 1);         if (j < N) F[j] += F[i];       }     }     void add(int i, T v) {       while (i <= N) {         F[i] += v;         i += lsb(i + 1);       }     }     T sum(int i) const {       T sum(t);       while (i) {         sum += F[i - 1];         i -= lsb(i);       }       return sum;     }     T range(int i, int j) const {       j++;       T s(t);       while (j > i) {         s += F[j - 1];         j -= lsb(j);       }       while (i > j) {         s -= F[i - 1];         i -= lsb(i);       }       return s;     }     T get(int i) const { return range(i, i); }     void set(int i, T v) { add(i, v - get(i)); }     constexpr int lsb(int i) const { return i & -i; }     unsigned int N;     vector<T> F;     T t;   };   template <typename T>   struct Fenwick2 {     explicit Fenwick2(unsigned int N = 0, T t = T())         : N(1u << logceil(N)), F(this->N, this->N, t), t(t) {}     void add(int first, int second, T v) {       while (first <= N) {         int z = second;         while (z <= N) {           F[first][z] += v;           z += lsb(z + 1);         }         first += lsb(first + 1);       }     }     T sum(int first, int second) {       T sum(t);       while (first <= N) {         int z = second;         while (z <= N) {           sum += F[first][z];           z -= lsb(z + 1);         }         first -= lsb(first + 1);       }       return sum;     }     T range(int x1, int y1, int x2, int y2) {       T ans = sum(x2, y2);       if (x1) ans -= sum(x1 - 1, y2);       if (y1) ans -= sum(x2, y1 - 1);       if (x1 && y1) ans += sum(x1 - 1, y1 - 1);       return ans;     }     constexpr int lsb(int i) const { return i & -i; }     unsigned int N;     vector2<T> F;     T t;   };   class LittleElephantAndRetroStrings {    public:     void solve(istream& cin, ostream& cout) {       int N, K;       cin >> N >> K;       string S;       cin >> S;       vector2<Field<1000000007>> D(2, N - K + 1, 0);       vector<Field<1000000007>> X(N + 1, 1), R(N + 1, 1);       vector<int> W(N + 1, 0);       Field<1000000007> half = Field<1000000007>{1} / 2;       for (int r = 0; r < 2; ++r) {         char z = r ?  B  :  W ;         for (int i = 0; i < N; ++i) {           W[i + 1] = W[i] + (S[i] == z);           X[i + 1] = X[i];           R[i + 1] = R[i];           if (S[i] ==  X ) {             X[i + 1] += X[i];             R[i + 1] *= half;           }         }         Fenwick<Field<1000000007>> F(N, 0), G(N, 0);         Field<1000000007> f = 0, g = 0;         for (int i = 0; i + K <= N; ++i) {           if (W[i + K] == W[i]) {             D[r][i] = X[i];             D[r][i] -= f;             D[r][i] -= X[i] * g;           }           if (i - K >= 0) {             f -= D[r][i - K];             g += D[r][i - K] * R[i];           }           f += D[r][i];         }         for (int i = 0; i + K <= N; ++i) D[r][i] *= R[i + K];         if (r)           for (int i = 1; i + K <= N; ++i) D[1][i] += D[1][i - 1];         else           reverse(S.begin(), S.end());       }       Field<1000000007> ans = 0;       for (int i = 0; i <= N - 2 * K; ++i) {         ans += D[0][i] * D[1][N - 2 * K - i];       }       cout << ans * X[N] << endl;     }   };   int main() {     ios_base::sync_with_stdio(false);     cin.tie(nullptr);     cout.tie(nullptr);     LittleElephantAndRetroStrings solver;     std::istream& in(std::cin);     std::ostream& out(std::cout);     solver.solve(in, out);     return 0;   }   