1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| #include <bits/stdc++.h>
#ifdef ORZXKR #include <debug.h> #else #define debug(...) 1 #endif #define file(s) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout)
using namespace std;
namespace FASTIO { char ibuf[1 << 21], *p1 = ibuf, *p2 = ibuf; char getc() { return p1 == p2 && (p2 = (p1 = ibuf) + fread(ibuf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++; } template<class T> bool read(T &x) { x = 0; int f = 0; char ch = getc(); while (ch < '0' || ch > '9') f |= ch == '-', ch = getc(); while (ch >= '0' && ch <= '9') x = (x * 10) + (ch ^ 48), ch = getc(); x *= f; return 1; } template<typename A,typename ...B> bool read(A &x, B &...y) { return read(x) || read(y...); }
char obuf[1 << 21], *o1 = obuf, *o2 = obuf + (1 << 21) - 1; void flush() { fwrite(obuf, 1, o1 - obuf, stdout), o1 = obuf; } void putc(char x) { *o1++ = x; if (o1 == o2) flush(); } template<class T> void write(T x) { if (!x) putc('0'); if (x < 0) x = -x, putc('-'); char c[40]; int tot = 0; while (x) c[++tot] = x % 10, x /= 10; for (int i = tot; i; --i) putc(c[i] + '0'); } void write(char x) { putc(x); } template<typename A,typename ...B> void write(A x, B ...y) { write(x), write(y...); } struct Flusher { ~Flusher() { flush(); } } flusher; } using FASTIO::read; using FASTIO::putc; using FASTIO::write;
const int kMaxN = 1e5 + 5, kMod = 1e9 + 7;
int n; int ss[kMaxN], f[kMaxN][4][4][4]; char s[kMaxN];
int add(int x, int y) { return (x + y >= kMod) ? (x + y - kMod) : (x + y); }
int main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif scanf("%s", s + 1); n = strlen(s + 1); for (int i = 1; i <= n; ++i) { if (s[i] == 'A') ss[i] = 0; else if (s[i] == 'G') ss[i] = 1; else if (s[i] == 'C') ss[i] = 2; else if (s[i] == 'T') ss[i] = 3; else ss[i] = -1; } for (int i = 0; i < 4; ++i) { if (ss[1] != -1 && ss[1] != i) continue ; for (int j = 0; j < 4; ++j) { f[1][i][i][j] = 1; } } for (int i = 2; i <= n; ++i) { for (int a = 0; a < 4; ++a) { if (ss[i] != -1 && ss[i] != a) continue ; for (int b = 0; b < 4; ++b) { for (int c = 0; c < 4; ++c) { for (int lst = 0; lst < 4; ++lst) { if (lst != a) f[i][a][b][c] = add(f[i][a][b][c], f[i - 1][lst][b][c]); } } } for (int b = 0; b < 4; ++b) { for (int c = 0; c < 4; ++c) { for (int lst = 0; lst < 4; ++lst) { if (lst == c) f[i][a][a][b] = add(f[i][a][a][b], f[i - 1][lst][b][c]); } } } } } int ans = 0; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { ans = add(ans, f[n][i][j][i]); } } write(ans); return 0; }
|