# 13805 - Professor Bear's Challenge >author: Utin ###### tags: `string` --- ## Brief 需建表並加入時間參數q以免TLE String Operation目前已知共有4種變化 13572 String Operations 1 13573 String Operations 2 13692 Aftermath’s Ideology 13805 Professor Bear’s Challenge ## Solution 0 ```c= #include <stdio.h> #include <string.h> long long Q; char arr[1000001]; // input char table[100001][26]; // alphabet table long long op[100001][3]; // operation queue long long shift[1000001]; // for operation 4 int main() { scanf("%s", arr); scanf("%lld", &Q); long long len = strlen(arr); for (long long i = 0; i < 26; i++) table[Q][i] = 'a' + i; // input for (long long q = 0; q < Q; q++) { scanf("%lld", &op[q][0]); if (op[q][0] == 1) { char temp1, temp2; scanf(" %c %c", &temp1, &temp2); op[q][1] = temp1; op[q][2] = temp2; } else if (op[q][0] == 2) { char temp; scanf("%lld %c", &op[q][1], &temp); op[q][2] = temp; } else if (op[q][0] == 3) { scanf("%lld %lld", &op[q][1], &op[q][2]); } else if (op[q][0] == 4) { scanf("%lld", &op[q][1]); } } // operation type 1 for (long long q = Q-1; q >= 0; q--) { // update for (long long i = 0; i < 26; i++) { table[q][i] = table[q+1][i]; } if (op[q][0] == 1) { table[q][op[q][1]-'a'] = table[q+1][op[q][2]-'a']; } } // operation type 4 for (long long q = 0; q < Q; q++) { if (q != 0) shift[q] = shift[q-1]; if (op[q][0] == 4) { shift[q] += op[q][1]; } } for (long long q = 0; q < Q; q++) { // operation type 2 if (op[q][0] == 2) { /* operation type 4 */ int index = op[q][1] - shift[q]; int temp = (-1 * index / len) + 1; index += len * temp; if (index >= len) index -= len; /********************/ arr[index] = table[q][op[q][2]-'a'] - 32; } // operation type 3 else if (op[q][0] == 3) { /* operation type 4 */ int index1 = op[q][1] - shift[q]; int index2 = op[q][2] - shift[q]; int temp1 = (-1 * index1 / len) + 1; int temp2 = (-1 * index2 / len) + 1; index1 += len * temp1; index2 += len * temp2; if (index1 >= len) index1 -= len; if (index2 >= len) index2 -= len; /********************/ char temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; } } // output for (long long i = 0; i < len; i++) { /* operation type 4 */ int index = i - shift[Q-1]; int temp = (-1 * index / len) + 1; index += len * temp; if (index >= len) index -= len; /********************/ if (arr[index] >= 'a') printf("%c", table[0][arr[index]-'a']); else printf("%c", arr[index] + 32); } printf("\n"); } // By Utin ``` ## Reference