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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

bzoj 2119 股市的预测 —— 枚举关键点+后缀数组

發(fā)布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj 2119 股市的预测 —— 枚举关键点+后缀数组 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:https://www.lydsy.com/JudgeOnline/problem.php?id=2119

思路就是對于這個形如 ABA 的串,枚舉 A 的長度,并按照長度分出幾塊,找到一些關(guān)鍵點就是塊的開頭;

那么每一種 ABA 的串,A 的部分一定覆蓋了一個關(guān)鍵點;

所以找關(guān)鍵點周圍的匹配長度算答案,具體就是找和對應位置的 lcp + lcs,那么 ABA 可以在對應匹配的地方滑動,就能找到所有 ABA 了;

因為是差分數(shù)組所以 n-1,而且注意連接正反串的字符要比串內(nèi)字符小,不是 '0'-1 而是 0 ...

代碼如下:

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int rd() {int ret=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return f?ret:-ret; } int Min(int x,int y){return x<y?x:y;} int const xn=1e5+5; int n,mx,d,m,s[xn],t[xn],tt[xn],tax[xn],sa[xn],rk[xn],tp[xn]; int op[xn],ht[xn][20],bin[20],bit[xn]; void rsort() {for(int i=1;i<=m;i++)tax[i]=0;for(int i=1;i<=mx;i++)tax[rk[tp[i]]]++;for(int i=1;i<=m;i++)tax[i]+=tax[i-1];for(int i=mx;i;i--)sa[tax[rk[tp[i]]]--]=tp[i]; } void work() {for(int i=1;i<=mx;i++)rk[i]=s[i],tp[i]=i;m=n; rsort();for(int k=1;k<=mx;k<<=1){int num=0;for(int i=mx-k+1;i<=mx;i++)tp[++num]=i;for(int i=1;i<=mx;i++)if(sa[i]>k)tp[++num]=sa[i]-k;rsort(); swap(rk,tp);rk[sa[1]]=1; num=1;for(int i=2;i<=mx;i++)rk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+k]==tp[sa[i-1]+k])?num:++num;if(num==mx)break;m=num;} } void geth() {int k=0;for(int i=1;i<=mx;i++){if(rk[i]==1)continue;if(k)k--; int j=sa[rk[i]-1];while(s[i+k]==s[j+k]&&i+k<=mx&&j+k<=mx)k++;ht[rk[i]][0]=k;}bin[0]=1; for(int i=1;i<20;i++)bin[i]=(bin[i-1]<<1);bit[1]=0; for(int i=2;i<=mx;i++)bit[i]=bit[i>>1]+1;for(int i=1;i<20;i++)for(int j=1;j+bin[i]-1<=mx;j++)ht[j][i]=Min(ht[j][i-1],ht[j+bin[i-1]][i-1]); } int getlcp(int x,int y) {if(x==y)return mx-x+1;x=rk[x]; y=rk[y];if(x>y)swap(x,y); x++;int r=bit[y-x+1];return Min(ht[x][r],ht[y-bin[r]+1][r]); } int main() {n=rd(); d=rd();for(int i=1;i<=n;i++)t[i]=rd();for(int i=n;i>1;i--)t[i]=t[i]-t[i-1],tt[i]=t[i];sort(t+1,t+n+1); int tot=unique(t+1,t+n+1)-t-1;for(int i=2;i<=n;i++)tt[i]=lower_bound(t+1,t+tot+1,tt[i])-t;n--; mx=2*n+1;for(int i=1;i<=n;i++)s[i]=tt[i+1];s[n+1]=0;//0for(int i=n+2,k=n;k;i++,k--)s[i]=s[k],op[k]=i;work(); geth(); int ans=0;for(int k=1;k<=n;k++)for(int i=1;i+k+d<=n;i+=k){int j=i+k+d;int l1=getlcp(i,j),l2=getlcp(op[i],op[j]);l1=Min(l1,k); l2=Min(l2,k);if(l1&&l2&&l1+l2-1>=k)ans+=l1+l2-1-k+1;else if(l1&&l1>=k)ans+=l1-k+1;else if(l2&&l2>=k)ans+=l2-k+1;}printf("%d\n",ans);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Zinn/p/10325682.html

總結(jié)

以上是生活随笔為你收集整理的bzoj 2119 股市的预测 —— 枚举关键点+后缀数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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