#include <cstdio> #include <cstring> const int C = 1; const int Z = 2; const int NN = 200200; inline int cast(char color) { return color == 'C' || color == C ? C : Z; } inline int flip(int color) { switch (color) { case C: return Z; case Z: return C; } return color; } inline char up(char c) { return c == C ? 'C' : 'Z'; } int compute(const char *input, int len) { int **opts = new int *[len]; for (int i = 0; i < len; ++i) { opts[i] = new int[len]; memset(opts[i], 0, len * sizeof(int)); } for (int b = 0; b < len; ++b) { opts[b][b] = input[b]; for (int a = b - 1; a >= 0; --a) { for (int m = a; m < b; ++m) { opts[a][b] |= flip(opts[a][m] & opts[m + 1][b]); } } } int ret = opts[0][len - 1]; for (int i = 0; i < len; ++i) { delete[] opts[i]; } delete[] opts; return ret; } int options(char *word, int offset) { for (int i = offset; word[i]; ++i) { if (word[i] != 'N') { word[i] = cast(word[i]); } else { word[i] = C; int a = options(word, i + 1); word[i] = Z; int b = options(word, i + 1); word[i] = 'N'; return a + b; } } bool found = compute(word, strlen(word)); return found ? 1 : 0; } char word[NN]; char word2[NN]; int call() { strcpy(word2, word); return options(word2, 0); } int main() { int N, Q; scanf("%d%d%s", &N, &Q, word); int p; char r; printf("%d\n", call()); for (int i = 0; i < Q; ++i) { scanf("%d %c", &p, &r); word[p - 1] = r; printf("%d\n", call()); } return 0; }
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 | #include <cstdio> #include <cstring> const int C = 1; const int Z = 2; const int NN = 200200; inline int cast(char color) { return color == 'C' || color == C ? C : Z; } inline int flip(int color) { switch (color) { case C: return Z; case Z: return C; } return color; } inline char up(char c) { return c == C ? 'C' : 'Z'; } int compute(const char *input, int len) { int **opts = new int *[len]; for (int i = 0; i < len; ++i) { opts[i] = new int[len]; memset(opts[i], 0, len * sizeof(int)); } for (int b = 0; b < len; ++b) { opts[b][b] = input[b]; for (int a = b - 1; a >= 0; --a) { for (int m = a; m < b; ++m) { opts[a][b] |= flip(opts[a][m] & opts[m + 1][b]); } } } int ret = opts[0][len - 1]; for (int i = 0; i < len; ++i) { delete[] opts[i]; } delete[] opts; return ret; } int options(char *word, int offset) { for (int i = offset; word[i]; ++i) { if (word[i] != 'N') { word[i] = cast(word[i]); } else { word[i] = C; int a = options(word, i + 1); word[i] = Z; int b = options(word, i + 1); word[i] = 'N'; return a + b; } } bool found = compute(word, strlen(word)); return found ? 1 : 0; } char word[NN]; char word2[NN]; int call() { strcpy(word2, word); return options(word2, 0); } int main() { int N, Q; scanf("%d%d%s", &N, &Q, word); int p; char r; printf("%d\n", call()); for (int i = 0; i < Q; ++i) { scanf("%d %c", &p, &r); word[p - 1] = r; printf("%d\n", call()); } return 0; } |