日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【BZOJ】1692: [Usaco2007 Dec]队列变换

發(fā)布時間:2025/7/14 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BZOJ】1692: [Usaco2007 Dec]队列变换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【算法】字符串hash

【題解】

顯然如果字母互不相同,貪心取是正確的。

如果存在字母相同,那么就換成比較后綴和前綴嘛。

但是要注意,不是后綴和前綴相同就能直接跳躍,每次必須只推一位。

取模的哈希比自然溢出慢了好多。

#include<cstdio> #include<algorithm> #include<cstring> #define ll long long using namespace std; const int maxn=30010,MOD=123456789,base=291; ll sum1[maxn],sum2[maxn],p[maxn]; int n; char c,s[maxn]; int calc1(int L,int R){return (sum1[R]+MOD-sum1[L-1]*p[R-L+1]%MOD)%MOD;} int calc2(int L,int R){return (sum2[L]+MOD-sum2[R+1]*p[R-L+1]%MOD)%MOD;} bool big(int L,int R){if(s[L]!=s[R])return s[L]>=s[R];int l=1,r=R-L+2;while(l<r){int mid=(l+r)>>1;if(calc1(L,L+mid-1)==calc2(R-mid+1,R))l=mid+1;else r=mid;}return s[L+l-1]>=s[R-l+1]; } int main(){scanf("%d",&n);for(int i=1;i<=n;i++){c=getchar();while(c<'A'||c>'Z')c=getchar();s[i]=c;}p[0]=1;for(int i=1;i<=n;i++)p[i]=p[i-1]*base%MOD;for(int i=1;i<=n;i++)sum1[i]=(sum1[i-1]*base+s[i]-'A')%MOD;for(int i=n;i>=1;i--)sum2[i]=(sum2[i+1]*base+s[i]-'A')%MOD;int L=1,R=n;for(int i=1,j=1;i<=n;i++,j++){if(!big(L,R)){putchar(s[L++]);}else{putchar(s[R--]);}if(j==80)putchar('\n'),j=0;}return 0; } View Code

?

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

總結(jié)

以上是生活随笔為你收集整理的【BZOJ】1692: [Usaco2007 Dec]队列变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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