TLE一个点,求助
查看原帖
TLE一个点,求助
600441
ZhongYuLin楼主2024/7/25 10:13

第 25 个点本机 5s。求问哪里出问题了。手写哈希表还没有 pbds 快。

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
using ll=long long;
const int M=998244353,N=3e5+3,MAX=50,B=1e7+3,
    P1=1e9+7,P2=19260817,MUL1=13331,MUL2=132331;
int fa[N],a[N],nxt[N],pre[N];
int n,m;
ll h1[B],pw1[B],h2[B],pw2[B];
gp_hash_table<ll,int>cnt;
ll calc(ll a,ll b){return a*P2+b;}
int get1(int l,int r){return (h1[r]-h1[l-1]*pw1[r-l+1]%P1+P1)%P1;}
int get2(int l,int r){return (h2[r]-h2[l-1]*pw2[r-l+1]%P2+P2)%P2;}
int main(){
    int op,x,y,z,u,v,w;string s;
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    pw1[0]=pw2[0]=1;
    for(int i=1;i<B;++i)
        pw1[i]=pw1[i-1]*MUL1%P1,
        pw2[i]=pw2[i-1]*MUL2%P2;
    cin>>n>>m;
    for(int i=1;i<=n;++i)cin>>a[i],++cnt[calc(a[i],a[i])];
    for(;m--;){
        cin>>op;
        if(op==1){
            cin>>x>>y;int sum=0;
            nxt[x]=y;pre[y]=x;
            for(z=x;pre[z]&&sum<MAX;z=pre[z],++sum);
            for(;z;z=nxt[z]){
                ll k1=0,k2=0;sum=0;bool flg=0;
                for(u=z;u&&sum<MAX;u=nxt[u],++sum){
                    k1=(k1*MUL1+a[u])%P1;
                    k2=(k2*MUL2+a[u])%P2;
                    if(flg)++cnt[calc(k1,k2)];
                    if(u==x)flg=1;
                }
            }
        }else if(op==2){
            cin>>x;int sum=0;
            for(z=x;pre[z]&&sum<MAX;z=pre[z],++sum);
            for(;z;z=nxt[z]){
                ll k1=0,k2=0;sum=0;bool flg=0;
                for(u=z;u&&sum<MAX;u=nxt[u],++sum){
                    k1=(k1*MUL1+a[u])%P1;
                    k2=(k2*MUL2+a[u])%P2;
                    if(flg)--cnt[calc(k1,k2)];
                    if(u==x)flg=1;
                }
            }
            pre[nxt[x]]=0;nxt[x]=0;
        }else{
            cin>>s>>x;int len=s.size();
            for(int i=1;i<=len;++i)
                h1[i]=(h1[i-1]*MUL1+s[i-1]-'0')%P1,
                h2[i]=(h2[i-1]*MUL2+s[i-1]-'0')%P2;
            ll ans=1;
            for(int i=1;i<=len-x+1;++i)
                ans=ans*cnt[calc(get1(i,i+x-1),get2(i,i+x-1))]%M;
            printf("%lld\n",ans);
        }
    }
    return 0;   
}
2024/7/25 10:13
加载中...