日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ4943 洛谷3823 UOJ315:[NOI2017]蚯蚓排队——题解

發(fā)布時間:2025/3/18 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ4943 洛谷3823 UOJ315:[NOI2017]蚯蚓排队——题解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

https://www.lydsy.com/JudgeOnline/problem.php?id=4943

http://uoj.ac/problem/315

https://www.luogu.org/problemnew/show/P3823#sub

題面太長自己看吧orz。

參考:洛谷題解。

用鏈表暴力維護每個蚯蚓,每次合并和分離只對k*k的元素有影響,哈希一下存起來query時候比較就好了。

沒了。

(具體復雜度我不會證明,以及bzoj卡空間,正常的哈希表空間總覺得不能開如代碼所示的這么小。)

(自然溢出hash真的塊)

#include<cmath> #include<stack> #include<vector> #include<cstdio> #include<cctype> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; const int N=2e5+5; const int K=50; const int mod=998244353; const int p=19260817; const int B=13; inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } struct node{int nxt,cnt;ll w; }e[21000000]; char s[10000005]; int n,m,cnt,head[p+5],t[10],a[N]; int nxt[N],pre[N]; ull f[K*2+5],base[K+5]; inline void add(ull w,int on){int u=w%p;for(int i=head[u];i;i=e[i].nxt){if(e[i].w==w){e[i].cnt+=on;return;}}e[++cnt].cnt=1;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt; } inline int ask(ull w){int u=w%p;for(int i=head[u];i;i=e[i].nxt){if(e[i].w==w)return e[i].cnt;}return 0; } void merge(int x,int y){int l=K+1,r=K;memset(f,0,sizeof(f));for(int i=x;i&&l>1;i=pre[i])f[--l]=a[i];for(int j=y;j&&r<2*K;j=nxt[j])f[++r]=a[j];for(int i=l;i<=r;i++)f[i]+=f[i-1]*B;for(int i=l;i<=K;i++){for(int j=K+1;j<=min(r,i+K-1);j++){add(f[j]-f[i-1]*base[j-i+1],1);}}nxt[x]=y;pre[y]=x; } void split(int x,int y){int l=K+1,r=K;memset(f,0,sizeof(f));for(int i=x;i&&l>1;i=pre[i])f[--l]=a[i];for(int j=y;j&&r<2*K;j=nxt[j])f[++r]=a[j];for(int i=l;i<=r;i++)f[i]+=f[i-1]*B;for(int i=l;i<=K;i++){for(int j=K+1;j<=min(r,i+K-1);j++){add(f[j]-f[i-1]*base[j-i+1],-1);}}nxt[x]=0;pre[y]=0; } int query(int k){ll ans=1;ull val=0;int len=strlen(s+1);if(k==1)for(int i=1;i<=len;i++)ans=ans*t[s[i]-'0']%mod;else{for(int i=1;i<=len;i++){val=val*B+s[i]-'0';if(i>k)val-=base[k]*(s[i-k]-'0');if(i>=k)ans=ans*ask(val)%mod;}}return ans; } int main(){n=read(),m=read();base[0]=1;for(int i=1;i<=K;i++)base[i]=base[i-1]*B;for(int i=1;i<=n;i++){a[i]=read();t[a[i]]++;}for(int i=1;i<=m;i++){int op=read();if(op==1){int x=read(),y=read();merge(x,y);}if(op==2){int x=read();split(x,nxt[x]);}if(op==3){scanf("%s",s+1);int k=read();printf("%d\n",query(k));}}return 0; }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/?+

+++++++++++++++++++++++++++++++++++++++++++

轉載于:https://www.cnblogs.com/luyouqi233/p/9050287.html

總結

以上是生活随笔為你收集整理的BZOJ4943 洛谷3823 UOJ315:[NOI2017]蚯蚓排队——题解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。