一种基于bitset的优化(P8796 [蓝桥杯 2022 国 AC] 替换字符题解)自留

 
1
#include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 inline int rd(){ 5 int xx = 0, flag = 1; char ch = getchar(); 6 while(ch < '0' || ch > '9'){ 7 if(ch == '-')flag = -1; 8 ch = getchar(); 9 } 10 while(ch >= '0' && ch <= '9'){ 11 xx = xx * 10 + ch - '0'; 12 ch = getchar(); 13 } 14 return xx * flag; 15 } 16 17 const int N = 1e5 + 5; 18 int n, m; 19 char s[N]; 20 int L[400], R[400], belong[N], cnt = 0, length; 21 bitset<400>b[30][400]; 22 void change(int l, int r, int f, int t){ 23 int pl = belong[l], pr = belong[r]; 24 if(pl == pr){ 25 for(int i = l,j = l - L[pl] + 1; i <= r; i++, j++){ 26 if(b[f][pl].test(j)){ 27 b[t][pl].set(j); 28 b[f][pl].reset(j); 29 } 30 } 31 }else { 32 for(int i = l, j = l - L[pl] + 1; i <= R[pl]; i++, j++){ 33 if(b[f][pl].test(j)){ 34 b[t][pl].set(j); 35 b[f][pl].reset(j); 36 } 37 } 38 for(int i = L[pr], j = 1; i <= r; i++, j++){ 39 if(b[f][pr].test(j)){ 40 b[t][pr].set(j); 41 b[f][pr].reset(j); 42 } 43 } 44 45 for(int i = pl + 1; i < pr; i++){ 46 b[t][i] |= b[f][i]; 47 b[f][i].reset(); 48 } 49 } 50 } 51 void print(){ 52 memset(s, 0, sizeof(s)); 53 for(int j = 1; j <= cnt; j++){ 54 for(int k = L[j], o = 1; k <= R[j]; k++, o++){ 55 for(int i = 1; i <= 26; i++){ 56 if(b[i][j].test(o)){ 57 s[k] = i + 'a' - 1; 58 break; 59 } 60 } 61 } 62 } 63 puts(s + 1); 64 } 65 int main(){ 66 scanf("%s", s + 1); 67 n = strlen(s + 1); 68 length = pow(n, 0.5); 69 while(R[cnt] < n){ 70 cnt ++; 71 L[cnt] = R[cnt - 1] + 1; 72 R[cnt] = L[cnt] + length - 1; 73 } R[cnt] = n; 74 for(int i = 1; i <= cnt; i++){ 75 for(int j = L[i], k = 1; j <= R[i]; j++, k++){ 76 belong[j] = i; 77 b[s[j] - 'a' + 1][i].set(k); 78 } 79 } 80 //print(); 81 m = rd(); 82 int l, r, c1, c2; 83 for(int i = 1; i <= m; i++){ 84 l = rd(), r = rd(); 85 c1 = getchar() - 'a' + 1, getchar(), c2 = getchar() - 'a' + 1; 86 change(l, r, c1, c2);//print(); 87 } 88 print(); 89 }

使用bitset可以快速实现复制,修改等操作,并且时间复杂度低。

posted @ 2025-05-18 17:30  指挥的智慧  阅读(12)  评论(0)    收藏  举报