如果你的unordered_map被卡了,那么使用以下技巧,99%的情况都可以过,亲测比map快!
其实我们要从底层原理来了解为什么unordered_map会被卡,是因为它的load_factor超过
了设定的阈值max_load_factor就会引发哈希表的重建,这个时间耗费才是关键
我们姑且把load_factor称为负载因子,它等于无序桶的数目/所有元素的数目,个人经验max_load_factor值取0.25并将初始化桶数设置为1024可以最大化避免大数据hash的时间
(ps:这个最优化不一定是要求重建次数最小,而是在重建时这个表的规模大小和重建次数中做个平衡~)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <bitset>
#include <assert.h>
#include <unordered_map>
#include <climits>
#define ll long long
#define cf int qq;cin>>qq;while(qq--)
#define debug(s) cout<<s<<endl;
#define endl '\n'
#define pr(x) cout << #x << " = " << x << endl
#define pr_all(x) for(auto i:x){ cout<<i<<" ";}puts("");
#define F first
#define S second
#define pb push_back
#define Fast_IO() {ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);}
#define lb(x) (x&(-x))
#define ls(x) x<<1
#define rs(x) x<<1|1
#define hashset_finetune(p) p.reserve(1024);p.max_load_factor(0.25);
using namespace std;
const int N = 2e5+10;
const int mod= 998244353;
int n,a[N],ans[N];
unordered_map<int,int>lastpos,vis;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
hashset_finetune(lastpos);
hashset_finetune(vis);
for(int i=n;i>=1;i--){
if(!vis[a[i]]){
lastpos[a[i]]=i;
vis[a[i]]=1;
}
}
int ans=1;
for(int i=1;i<=n;i++){
int val=a[i];
int maxstep=lastpos[val];
//pr(maxstep);
for(int j=i;j<=maxstep;j++){
maxstep=max(maxstep,lastpos[a[j]]);
}
i=maxstep;
if(i!=n)ans=ans*2%mod;
}
cout<<ans<<endl;
}
感谢大佬
感谢大佬!!!