【前言】
后缀数组一直是我没有背的板子来着。
强行背了下来。
adjust这个函数丢不掉了。

【题目】

BZOJ4199 [NOI2015] 品酒大会

BZOJ
按heightheightheight从大到小拆隔板统计答案,启发式合并信息,只需要记录sizsizsiz和aia_iai​的最大最小值即可,其他东西并没有什么用。
复杂度O(nlog⁡n)O(n\log n)O(nlogn)。

#include<bits/stdc++.h>
#define pb push_back
using namespace std;typedef long long ll;
const int N=3e5+10;
const ll INF=(ll)1e18;namespace IO
{int read(){int ret=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return f?ret:-ret;}void write(ll x){if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10^48);}void writesp(ll x){write(x);putchar(' ');}void writeln(ll x){write(x);putchar('\n');}
}namespace SA
{int sa[N],rk[N],hi[N];int wa[N],wb[N],wx[N],wy[N];bool cmp(int *r,int a,int b,int l){return r[a]==r[b] && r[a+l]==r[b+l];}void getsa(int *r,int n,int m){int *x=wa,*y=wb,*t,i,j,p;for(i=0;i<m;++i) wx[i]=0;for(i=0;i<n;++i) wx[x[i]=r[i]]++;for(i=1;i<m;++i) wx[i]+=wx[i-1];for(i=n-1;~i;--i) sa[--wx[x[i]]]=i;for(j=1,p=0;p<n;j<<=1,m=p){for(p=0,i=n-j;i<n;++i) y[p++]=i;for(i=0;i<n;++i) if(sa[i]>=j) y[p++]=sa[i]-j; for(i=0;i<m;++i) wx[i]=0;for(i=0;i<n;++i) wx[wy[i]=x[y[i]]]++;for(i=1;i<m;++i) wx[i]+=wx[i-1];for(i=n-1;~i;--i) sa[--wx[wy[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;++i)x[sa[i]]=cmp(y,sa[i],sa[i-1],j)?p-1:p++;} }void getheight(int *r,int n){int i,j,k=0;for(i=1;i<=n;++i) rk[sa[i]]=i;for(i=0;i<n;hi[rk[i++]]=k)for(k?--k:0,j=sa[rk[i]-1];r[i+k]==r[j+k];++k);}void adjust(int n){for(int i=n;i;--i) ++sa[i],rk[i]=rk[i-1];sa[0]=rk[0]=0;}void output(int n){for(int i=0;i<=n;++i) printf("%d ",sa[i]); puts("");for(int i=0;i<=n;++i) printf("%d ",rk[i]); puts("");for(int i=0;i<=n;++i) printf("%d ",hi[i]); puts("");}void buildsa(int *r,int n,int m){getsa(r,n+1,m);getheight(r,n);adjust(n);//output(n);}
}
using namespace SA;namespace DreamLolita
{int n;int a[N],val[N],fa[N];char s[N];ll ans1[N],ans2[N];vector<int>st[N];struct data{int sz,mx,mi;data(int _s=0,int _x=0,int _i=0):sz(_s),mx(_x),mi(_i){}}d[N];ll cross(const data&a,const data&b){ll t1=max((ll)a.mx*b.mx,(ll)a.mi*b.mi);ll t2=max((ll)a.mx*b.mi,(ll)a.mi*b.mx);return max(t1,t2);}void merge(int x,int y){d[y].sz+=d[x].sz;d[y].mx=max(d[y].mx,d[x].mx);d[y].mi=min(d[y].mi,d[x].mi);fa[x]=y;}int findf(int x){return fa[x]==x?x:fa[x]=findf(fa[x]);}void solution(){n=IO::read();scanf("%s",s);for(int i=0;i<n;++i) a[i]=s[i]-'a'+1,val[i+1]=IO::read(),fa[i+1]=i+1;buildsa(a,n,30);for(int i=1;i<=n;++i) d[i]=data(1,val[sa[i]],val[sa[i]]);for(int i=2;i<=n;++i) st[hi[i]].pb(i-1); ans1[n]=0;ans2[n]=-INF;for(int h=n-1;~h;--h){ans1[h]=ans1[h+1];ans2[h]=ans2[h+1];if(!st[h].size()) continue;for(int i=0;i<(int)st[h].size();++i){int x=st[h][i],y=x+1;x=findf(x);y=findf(y);ans1[h]+=(ll)d[x].sz*d[y].sz;ans2[h]=max(ans2[h],cross(d[x],d[y]));merge(x,y);}}for(int i=0;i<n;++i) IO::writesp(ans1[i]),IO::writeln(ans1[i]?ans2[i]:0ll);}
}int main()
{#ifndef ONLINE_JUDGEfreopen("BZOJ4199.in","r",stdin);freopen("BZOJ4199.out","w",stdout);
#endifDreamLolita::solution();return 0;
}

BZOJ4650 [NOI2016] 优秀的拆分

BZOJ
考虑统计答案的方式,我们fif_ifi​为以iii为结尾的AAAAAA串有多少个,gig_igi​为以iii为开头的AAAAAA串有多少个,那么显然ans=∑figi+1ans=\sum f_ig_{i+1}ans=∑fi​gi+1​
现在要求这两个数组,我们不妨枚举其中AAA的长度LLL,考虑每隔LLL个位置设置一个断点,那么一个合法的AAAAAA串必然经过两个断点,于是我们求出以两个断点为中心的lcp,lcslcp,lcslcp,lcs,就可以计算出同时经过这两个断点长度为2L2L2L的AAAAAA串贡献区间,差分打标记即可。这部分复杂度是调和级数级别的。
复杂度O(nlog⁡n)O(n\log n)O(nlogn)

#include<bits/stdc++.h>
using namespace std;typedef long long ll;
const int N=3e4+10;namespace SA
{struct DADADA{int sa[N],rk[N],hi[N],h[15][N];int wx[N],wy[N],wa[N],wb[N];int fc[15],Log[N];bool cmp(int *r,int a,int b,int l){return r[a]==r[b] && r[a+l]==r[b+l];}void getsa(int *r,int n,int m){int *x=wa,*y=wb,*t,i,j,p;for(i=0;i<m;++i) wx[i]=0;for(i=0;i<n;++i) wx[x[i]=r[i]]++;for(i=1;i<m;++i) wx[i]+=wx[i-1];for(i=n-1;~i;--i) sa[--wx[x[i]]]=i;for(j=1,p=0;p<n;j<<=1,m=p){for(p=0,i=n-j;i<n;++i) y[p++]=i;for(i=0;i<n;++i) if(sa[i]>=j) y[p++]=sa[i]-j;for(i=0;i<m;++i) wx[i]=0;for(i=0;i<n;++i) wx[wy[i]=x[y[i]]]++;for(i=1;i<m;++i) wx[i]+=wx[i-1];for(i=n-1;~i;--i) sa[--wx[wy[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;++i)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;} }void getheight(int *r,int n){int i,j,k=0;for(i=1;i<=n;++i) rk[sa[i]]=i;for(i=0;i<n;hi[rk[i++]]=k)for(k?--k:0,j=sa[rk[i]-1];r[i+k]==r[j+k];++k);}void adjust(int n){for(int i=n;i;--i) sa[i]++,rk[i]=rk[i-1];sa[0]=rk[0]=0;}void initrmq(int n){fc[0]=1;for(int i=1;i<15;++i) fc[i]=fc[i-1]<<1;for(int i=2;i<=n;++i) Log[i]=Log[i>>1]+1;for(int i=1;i<=n;++i) h[0][i]=hi[i];for(int j=1;j<15;++j) for(int i=1;i+fc[j]-1<=n;++i)h[j][i]=min(h[j-1][i],h[j-1][i+fc[j-1]]);}void output(int n){for(int i=0;i<=n;++i) printf("%d ",sa[i]); puts("");for(int i=0;i<=n;++i) printf("%d ",rk[i]); puts("");for(int i=0;i<=n;++i) printf("%d ",hi[i]); puts("");}void buildsa(int *r,int n,int m){getsa(r,n+1,m);getheight(r,n);adjust(n);initrmq(n);//output(n);}void clear(){memset(sa,0,sizeof(sa));memset(hi,0,sizeof(hi));}int calc(int l,int r){int t=Log[r-l+1];return min(h[t][l],h[t][r-fc[t]+1]);}int lcp(int x,int y){x=rk[x];y=rk[y];if(x>y)swap(x,y);return calc(x+1,y);}}s1,s2;
}
using namespace SA;namespace DreamLolita
{char s[N];int a[N],b[N],st[N],en[N],ltg[N],rtg[N];void clear(){memset(st,0,sizeof(st));memset(en,0,sizeof(en));memset(ltg,0,sizeof(ltg));memset(rtg,0,sizeof(rtg));memset(a,0,sizeof(a));memset(b,0,sizeof(b));}void solve(){clear();scanf("%s",s);int n=strlen(s);for(int i=0;i<n;++i) a[i]=b[n-i-1]=s[i]-'a'+1;s1.clear();s2.clear();s1.buildsa(a,n,30);s2.buildsa(b,n,30);ll ans=0;for(int l=1;l<=n;++l){for(int p1=l,p2=l+l;p2<=n;p1=p2,p2+=l){int lcs=s1.lcp(p1,p2),lcp=s2.lcp(n-p1+1,n-p2+1);lcs=min(lcs,l);lcp=min(lcp,l);if(lcs+lcp>l) {++ltg[p1-lcp+1];--ltg[p1+lcs-l+1];++rtg[p2+lcs-1];--rtg[p2-lcp+l-1];}}}for(int i=1;i<=n;++i) st[i]=st[i-1]+ltg[i];for(int i=n;i;--i) en[i]=en[i+1]+rtg[i];for(int i=1;i<n;++i) ans+=(ll)en[i]*st[i+1];printf("%lld\n",ans);}
}int main()
{#ifndef ONLINE_JUDGEfreopen("BZOJ4650.in","r",stdin);freopen("BZOJ4650.out","w",stdout);
#endifint T;scanf("%d",&T);while(T--){DreamLolita::solve();}return 0;
}

LGP5108 仰望半月的夜空

luogu
首先我们建出后缀数组。
考虑当前选择长度为iii的串,我们找到按字典序排下来长度≥i\geq i≥i的第一个串,然后找和它height≥iheight\geq iheight≥i的区间,那么可行的答案区间就是这个了,找最左的话随便RMQ\text{RMQ}RMQ一下就行了。
找出这个区间可以用类似倍增的写法。
复杂度O(nlog⁡n)O(n\log n)O(nlogn)

#include<bits/stdc++.h>
using namespace std;typedef long long ll;
const int N=3e5+10;
int fc[19],Log[N];namespace IO
{int read(){int ret=0;char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return ret;}void write(int x){if(x>9)write(x/10);putchar(x%10^48);}void writesp(int x){write(x);putchar(' ');}
}namespace SA
{int sa[N],rk[N],hi[N],h[19][N],pos[19][N];int wa[N],wb[N],wx[N],wy[N];bool cmp(int *r,int a,int b,int l){return r[a]==r[b] && r[a+l]==r[b+l];}void getsa(int *r,int n,int m){int*x=wa,*y=wb,*t,i,j,p;for(i=0;i<m;++i) wx[i]=0;for(i=0;i<n;++i) wx[x[i]=r[i]]++;for(i=1;i<m;++i) wx[i]+=wx[i-1];for(i=n-1;~i;--i) sa[--wx[x[i]]]=i;for(j=1,p=0;p<n;j<<=1,m=p){for(p=0,i=n-j;i<n;++i) y[p++]=i;for(i=0;i<n;++i) if(sa[i]>=j) y[p++]=sa[i]-j;for(i=0;i<m;++i) wx[i]=0;for(i=0;i<n;++i) wx[wy[i]=x[y[i]]]++;for(i=1;i<m;++i) wx[i]+=wx[i-1];for(i=n-1;~i;--i) sa[--wx[wy[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;++i)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}}void getheight(int *r,int n){int i,j,k=0;for(i=1;i<=n;++i) rk[sa[i]]=i;for(i=0;i<n;hi[rk[i++]]=k)for(k?k--:0,j=sa[rk[i]-1];r[i+k]==r[j+k];++k);}void adjust(int n){for(int i=1;i<=n;++i) sa[i]++;for(int i=n;i;--i) rk[i]=rk[i-1];rk[0]=sa[0]=0;}void initrmq(int n){fc[0]=1;for(int i=1;i<19;++i)fc[i]=fc[i-1]<<1;for(int i=2;i<=n;++i) Log[i]=Log[i>>1]+1;for(int i=1;i<=n;++i) h[0][i]=hi[i],pos[0][i]=sa[i];//for(int i=1;i<=n;++i) cerr<<h[0][i]<<endl;for(int j=1;j<19;++j) for(int i=1;i+fc[j]-1<=n;++i)h[j][i]=min(h[j-1][i],h[j-1][i+fc[j-1]]),pos[j][i]=min(pos[j-1][i],pos[j-1][i+fc[j-1]]);}void output(int n){for(int i=0;i<=n;++i) printf("%d ",sa[i]); puts("");for(int i=0;i<=n;++i) printf("%d ",rk[i]); puts("");for(int i=0;i<=n;++i) printf("%d ",hi[i]); puts("");}void buildsa(int *r,int n,int m){getsa(r,n+1,m);getheight(r,n);adjust(n);initrmq(n);//output(n);}int calc(int x,int y){int t=Log[y-x+1];return min(h[t][x],h[t][y-fc[t]+1]);}int calp(int x,int y){int t=Log[y-x+1];return min(pos[t][x],pos[t][y-fc[t]+1]);}
}
using SA::h;
using SA::pos;
using SA::calc;
using SA::calp;namespace DreamLolita
{int rho,n,len;int a[N],b[N],ans[N];char s[N];void input(){rho=IO::read();n=IO::read();if(rho==26){scanf("%s",s);len=rho;for(int i=0;i<n;++i) a[i]=s[i]-'a'+1;}else{for(int i=0;i<n;++i) a[i]=b[i]=IO::read();sort(b,b+n);len=unique(b,b+n)-b;for(int i=0;i<n;++i) a[i]=lower_bound(b,b+len,a[i])-b+1;}len+=4;}void solve(){SA::buildsa(a,n,len);int now=1;for(int i=1;i<=n;++i){while(n-pos[0][now]+1<i) ++now;ans[i]=pos[0][now];//cerr<<now<<" "<<h[0][now]<<" "<<pos[0][now]<<endl;for(int p=now+1,j=18;~j;--j){if(p+fc[j]-1>n) continue;//int t=calc(now+1,p+fc[j]-1);if(calc(now+1,p+fc[j]-1)>=i) ans[i]=min(ans[i],calp(now+1,p+fc[j]-1)),p=p+fc[j];}}for(int i=1;i<=n;++i) IO::writesp(ans[i]);}
}int main()
{#ifndef ONLINE_JUDGEfreopen("LGP5108.in","r",stdin);freopen("LGP5108.out","w",stdout);
#endifDreamLolita::input();DreamLolita::solve();return 0;
}

CF504E Misha and LCP on Tree

codeforces
我们只需求路径LCP。
有一种十分暴力的方法:先将树长链剖分,按每条链的顺序建后缀数组,每次询问就是在log⁡n\log nlogn条链上求lcplcplcp,对应后缀数组中log⁡n\log nlogn个区间。
有什么好做法吗?

#include<bits/stdc++.h>
#define pb push_back
using namespace std;const int N=6e5+10;namespace IO
{int read(){int ret=0;char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return ret;}void write(int x){if(x>9)write(x/10);putchar(x%10^48);}void writeln(int x){write(x);putchar('\n');}
}
using namespace IO;namespace Tree
{int tot,ind;int head[N],p1[N],p2[N];int siz[N],top[N],son[N],fa[N],dep[N];struct Tway{int v,nex;}e[N];void add(int u,int v){e[++tot]=(Tway){v,head[u]};head[u]=tot;e[++tot]=(Tway){u,head[v]};head[v]=tot;}void dfs1(int x){dep[x]=dep[fa[x]]+1;siz[x]=1;for(int i=head[x];i;i=e[i].nex){int v=e[i].v;if(v==fa[x]) continue;fa[v]=x;dfs1(v);siz[x]+=siz[v];if(siz[v]>siz[son[x]]) son[x]=v;}}void dfs2(int x,int tp){p1[x]=++ind;top[x]=tp;if(son[x]) dfs2(son[x],tp);for(int i=head[x];i;i=e[i].nex){int v=e[i].v;if(v==fa[x] || v==son[x]) continue;dfs2(v,v);}}int lca(int x,int y){while(top[x]^top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);x=fa[top[x]];}return dep[x]<dep[y]?x:y;}
}
using Tree::p1;
using Tree::p2;
using Tree::dep;
using Tree::top;
using Tree::fa;namespace SA
{int sa[N],rk[N],hi[N],h[20][N];int wa[N],wb[N],wx[N],wy[N];int remn,fc[21],Log[N];bool cmp(int *r,int a,int b,int l){return r[a]==r[b] && r[a+l]==r[b+l];}void getsa(int *r,int n,int m){int *x=wa,*y=wb,*t,i,j,p;for(int i=0;i<m;++i) wx[i]=0;for(int i=0;i<n;++i) wx[x[i]=r[i]]++;for(int i=1;i<m;++i) wx[i]+=wx[i-1];for(int i=n-1;~i;--i) sa[--wx[x[i]]]=i;for(j=1,p=0;p<n;j<<=1,m=p){for(p=0,i=n-j;i<n;++i) y[p++]=i;for(i=0;i<n;++i) if(sa[i]>=j) y[p++]=sa[i]-j;for(i=0;i<m;++i) wx[i]=0;for(i=0;i<n;++i) wx[wy[i]=x[y[i]]]++;for(i=1;i<m;++i) wx[i]+=wx[i-1];for(i=n-1;~i;--i) sa[--wx[wy[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;++i)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}}void getheight(int *r,int n){int i,j,k=0;for(i=1;i<=n;++i) rk[sa[i]]=i;for(i=0;i<n;hi[rk[i++]]=k)for(k?--k:0,j=sa[rk[i]-1];r[i+k]==r[j+k];++k);}void adjust(int n){for(int i=n;i;--i) ++sa[i],rk[i]=rk[i-1];sa[0]=rk[0]=0;}void initrmq(int n){fc[0]=1;for(int i=1;i<20;++i)fc[i]=fc[i-1]<<1;for(int i=2;i<=n;++i) Log[i]=Log[i>>1]+1;for(int i=1;i<=n;++i) h[0][i]=hi[i];for(int j=1;j<20;++j) for(int i=1;i+fc[j]-1<=n;++i)h[j][i]=min(h[j-1][i],h[j-1][i+fc[j-1]]);}void output(int n){for(int i=0;i<=n;++i) printf("%d ",sa[i]); puts("");for(int i=0;i<=n;++i) printf("%d ",rk[i]); puts("");for(int i=0;i<=n;++i) printf("%d ",hi[i]); puts("");}void buildsa(int *r,int n,int m){remn=n;getsa(r,n+1,m);getheight(r,n);adjust(n);initrmq(n);//}int calc(int l,int r){int t=Log[r-l+1];return min(h[t][l],h[t][r-fc[t]+1]);}int lcp(int l,int r){if(l==r)return remn-l+1;l=rk[l];r=rk[r];if(l>r)swap(l,r);return calc(l+1,r);}
}
using SA::lcp;namespace DreamLolita
{int n,Q,a[N];char s[N];struct data{int l,r,len;data(int _l=0,int _r=0,int _len=0):l(_l),r(_r),len(_len){}void out(){printf("%d %d %d\n",l,r,len);}};vector<data>inv1,inv2;void getinterval(vector<data> &a,int x,int y){a.clear();int z=Tree::lca(x,y);//cerr<<x<<" "<<y<<" "<<z<<" "<<top[x]<<" "<<top[y]<<endl;while(dep[top[x]]>=dep[z]) a.pb(data(p2[x],p2[top[x]],p2[top[x]]-p2[x]+1)),x=fa[top[x]];if(dep[x]>=dep[z]) a.pb(data(p2[x],p2[z],p2[z]-p2[x]+1));//cerr<<x<<" "<<p2[x]<<" "<<y<<" "<<p2[y]<<" "<<z<<" "<<p2[z]<<endl;int tmp=(int)a.size();while(dep[top[y]]>dep[z]) a.pb(data(p1[top[y]],p1[y],p1[y]-p1[top[y]]+1)),y=fa[top[y]];if(dep[y]>dep[z]) a.pb(data(p1[z]+1,p1[y],p1[y]-p1[z]));//cerr<<a.size()<<" "<<(*tmp).l<<endl;//for(int i=0;i<(int)a.size();++i) a[i].out();//if(tmp!=a.end()) ++tmp;for(int i=tmp,j=(int)a.size()-1;i<j;++i,--j) swap(a[i],a[j]);}void solve(){n=read();scanf("%s",s);for(int i=1;i<n;++i) Tree::add(read(),read());Tree::dfs1(1);Tree::dfs2(1,1);for(int i=1;i<=n;++i) p2[i]=n*2-p1[i]+1,a[p1[i]-1]=a[p2[i]-1]=s[i-1]-'a'+1;SA::buildsa(a,n*2,30);Q=read();while(Q--){int a=read(),b=read(),c=read(),d=read();//cerr<<a<<" "<<b<<" "<<c<<" "<<d<<"!"<<endl;getinterval(inv1,a,b);getinterval(inv2,c,d);//for(int i=0;i<(int)inv1.size();++i) printf("%d %d %d\n",inv1[i].l,inv1[i].r,inv1[i].len);//exit(0);int ans=0,p1=0,p2=0,l1=1,l2=1;//cerr<<inv1.size()<<" "<<inv2.size()<<endl;while(p1<(int)inv1.size() && p2<(int)inv2.size()){int len=min(lcp(inv1[p1].l+l1-1,inv2[p2].l+l2-1),min(inv1[p1].len-l1+1,inv2[p2].len-l2+1));ans+=len;if(len<min(inv1[p1].len-l1+1,inv2[p2].len-l2+1)) break;l1+=len;l2+=len;if(l1>inv1[p1].len) ++p1,l1=1;if(l2>inv2[p2].len) ++p2,l2=1;}writeln(ans);}}
}int main()
{#ifndef ONLINE_JUDGEfreopen("CF504E.in","r",stdin);freopen("CF504E.out","w",stdout);
#endifDreamLolita::solve();return 0;
}

【背板子-后缀数组】BZOJ4199 BZOJ4650 LGP5108 CF504E相关推荐

  1. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)

    题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...

  2. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  3. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  4. New Distinct Substrings(后缀数组)

    New Distinct Substrings(后缀数组) 给定一个字符串,求不相同的子串的个数.\(n<=50005\). 显然,任何一个子串一定是后缀上的前缀.先(按套路)把后缀排好序,对于 ...

  5. 【BZOJ4566】找相同字符,后缀数组

    传送门 思路: 偶然翻到的一个题 苦思冥想算法之时-- 旁边不(jing)会(tong)后缀数组的聪爷爷:这不是后缀数组吗? 赶紧来练一下遗忘的后缀数组(然后手打板子又错了,只能回到博客上重新翻一波以 ...

  6. 【BZOJ3879】SvT,后缀数组+单调栈维护sum

    Time:2016.08.15 Author:xiaoyimi 转载注明出处谢谢 如果有不明白的地方可以在下面评论问我 传送门 思路: 建立后缀数组求出Height 如果说对每次询问暴力求LCP累加的 ...

  7. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  8. [BZOJ]4199: [Noi2015]品酒大会(后缀数组+笛卡尔树)

    Time Limit: 10 Sec  Memory Limit: 512 MB Description Input Output Sample Input 10 ponoiiipoi 2 1 4 7 ...

  9. 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈

    P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...

最新文章

  1. linux内核设备管理典型算法,linux内核物理存储空间管理有哪些常用算法
  2. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
  3. Jmeter服务器监控 serveragent如何使用
  4. 汽车和山羊问题matlab_关于博弈的山羊与汽车问题
  5. AttributeError: 'numpy.ndarray' object has no attribute 'value_counts'
  6. 计算机电源插头有哪几种,盘点电连接器常见的使用类型
  7. 百度网盘空间调整:这类用户2TB变100GB!
  8. pure-ftp 修改用户信息
  9. 为啥连接mysql失败_为什么连接数据库后插入老是失败?
  10. iOS底层探索之多线程(十)—GCD源码分析( 信号量dispatch_semaphore_t)
  11. 帕萨特加载模式启用怎么解除_大众帕萨特VCDS刷隐藏功能方法
  12. LBP算法的Matlab代码
  13. 红米K30、K40所有版本获取root教程,理论上支持所有小米手机(超级详细,附带原理解释)
  14. 策略战棋游戏开发计划
  15. 老毛桃u盘装系统linux,老毛桃U盘装系统综合教程
  16. java计算机毕业设计文档资料管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  17. 创维E900V22C、E900V22D系列-UWE5621DS芯片语音免拆卡刷固件(当贝桌面)《虎年新春开机动画》
  18. Unity学习日常问题记录五--3dMax导入模型的一些问题
  19. docker-compose.yml修改volumes后重启不生效
  20. 一篇文章让你搞懂什么是Iaas、Paas、Saas

热门文章

  1. 【PC工具】HiPC手机远程控制电脑软件,微信小程序远程控制电脑
  2. yoyo跑_全力冲刺 目标YOYO(图)
  3. 水平、垂直居中布局大全
  4. homebrew是个啥
  5. 京东按关键字搜索商品 API 返回值说明
  6. 安鸾渗透telnet暴力破解
  7. BiLSTM / BiRNN / BiLSTM-CRF / Bert-BiLSTM-CRF 全网最强大厂面试级深度的知识点整理
  8. 腾讯云点播服务端API
  9. c语言缓冲区溢出函数,示例C程序上的缓冲区溢出
  10. 学术期刊划分(SCI、EI、SSCI、IEEE、CSSCI等)