- 分享
神奇的memset
- 2024-11-17 17:31:12 @
洛谷P8306,memset这个数组是20分,forAC,memset初始化整个数组慢我理解,但即使向memset第三个值不传sizeof...,而是计算好要初始化的地方,还是没for快,按理来说应该是memset快呀。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int trie[3000010][65];
int cnt[3000010];
int idx;
int hx(char x)
{
if(x >= 'A' && x <= 'Z')
{
return x-'A';
}
else if(x >= 'a' && x <= 'z')
{
return x-'a'+26;
}
else if(x >= '0' && x <= '9')
{
return x-'0'+52;
}
}
void insert(string s)
{
int p = 0;
int l = s.size();
for(int i = 0; i < l; i++)
{
int j = hx(s[i]);
if(!trie[p][j])
{
trie[p][j] = ++idx;
}
p = trie[p][j];
cnt[p]++;
}
}
ll query(string s)
{
int p = 0;
int l = s.size();
ll sum = 0;
for(int i = 0; i < l; i++)
{
int j = hx(s[i]);
if(!trie[p][j])
{
return 0;
}
p = trie[p][j];
}
return cnt[p];
}
int main()
{
int T;
cin >> T;
while(T--)
{
//这是最快的
for(int i = 0; i <= idx; i++)
{
cnt[i] = 0;
for(int j = 0; j < 65; j++)
{
trie[i][j] = 0;
}
}
//这是最慢的
//memset(trie, 0, sizeof trie);
//memset(cnt, 0, sizeof cnt);
//这个竟然比for还慢
//memset(trie, 0, sizeof(int)*idx*65);
//memset(cnt, 0, sizeof(int)*idx);
idx = 0;
int n,q;
cin >> n >> q;
for(int i = 0; i < n; i++)
{
string t;
cin >> t;
insert(t);
}
for(int i = 0; i < q; i++)
{
string t;
cin >> t;
cout << query(t) << endl;
}
}
return 0;
}
2 comments
-
ZJH赵佳豪 LV 1 @ 2024-11-19 21:12:11
#include<bits/stdc++.h> using namespace std;
int main() { double A; cin >> A; if (A > 0)<<count A<<endl;
else if(A == 0)<<count A<<endl; else <<count -A<<endl; return 0;
} //求解分支第2题
-
2024-11-17 18:11:57@
已解决,是for优化了,memset没有,还是memset快,但不要用memset初始化整个大数组,只初始化要用了就行,第三个参数无脑填sizeof...会死的很惨
- 1