bitset用法
bitset:基本功能就是将一个数改为其二进制的形式
基于此特点有以下优化:
1.二维bool数组优化为bitset:
https://www.luogu.com.cn/problem/P3879

1 # include<iostream>
2 # include<bits/stdc++.h>
3 using namespace std;
4 # define int long long
5 # define endl "\n"
6 const int N = 5e5+5, M = 1e4 + 10;
7
8 int nex[500090][26], cnt;
9 bitset<1001> exist[300000];
10 int n;
11 char s[1010];
12 void insert(char *s, int i) {
13 int p = 0;
14 for (int i = 0; s[i]; ++i) {
15 int c = s[i] - 'a';
16 if (!nex[p][c]) nex[p][c] = ++cnt;
17 p = nex[p][c];
18 }
19 exist[p][i] = 1;
20 }
21
22 void find(char *s) {
23 int p = 0;
24 bool ok = true;
25 for (int i = 0;s[i]; ++i) {
26 int c = s[i] - 'a';
27 if (!nex[p][c]) {
28 ok = false;
29 break;
30 }
31 p = nex[p][c];
32 }
33 if (ok) {
34 for (int i = 1; i <= n; ++i) {
35 if(exist[p][i]){
36 cout<<i<<" ";
37 }
38 }
39 cout<<endl;
40 }
41 else {
42 cout<<" "<<endl;
43 }
44
45 }
46
47 void solve() {
48
49 cin >> n;
50 for (int i = 1; i <= n; ++i) {
51 int len;
52 cin >> len;
53 for (int j = 1; j <= len; ++j) {
54 cin >> s;
55 insert(s, i);
56 }
57 }
58 int q;
59 cin >> q;
60 while (q--) {
61 cin>>s;
62 find(s);
63 }
64 }
65 int tt;
66 signed main() {
67 ios::sync_with_stdio(false);
68 cin.tie(0);
69 cout.tie(0);
70 tt = 1;
71
72
73 // cin >> tt;
74 while (tt--)solve();
75
76
77 return 0;
78 }
数据范围本来是3e5*110的,加强数据后变为3e5*1100,如果只单纯的改bool数组为 exist[300010][1100]
mel前十个数据,所以用bitset优化空间,因为是bool数组只看每一位是0或1,所以bitset完美代替
大约节省为原来的1/32,具体的效果看题和测评机。
bitset<1005> exist[300010];
分类:
菜鸡的算法路
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】