后缀字典序中二分找查询串区间
Posted mxzf0213
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后缀字典序中二分找查询串区间相关的知识,希望对你有一定的参考价值。
bool cmp1(int pos,char *p) { pos=sa[pos]; int len1=n-pos+1,len2=now,l=min(len1,len2); int flag=strncmp(a+pos,p,l); return flag>0||(flag==0&&len1>=len2); } bool cmp2(int pos,char *p) { pos=sa[pos]; int len1=n-pos+1,len2=now,l=min(len1,len2); int flag=strncmp(a+pos,p,l); return flag<=0; }
bool ok(int pos,char *p)
{
pos=sa[pos];
int len=n-pos+1;
return len>=now&&strncmp(a+pos,p,now)==0;
} //main函数 int ql=1,qr=n,ans1=n+1,ans2=0; while(ql<=qr) { int mid=ql+qr>>1; if(cmp1(mid,b))ans1=mid,qr=mid-1; else ql=mid+1; } ql=1,qr=n; while(ql<=qr) { int mid=ql+qr>>1; if(cmp2(mid,b))ans2=mid,ql=mid+1; else qr=mid-1; } if(ans1<=ans2&&ok(ans1,b)&&ok(ans2,b)) { qu[l-1].pb(node{ans1,ans2,-i}); qu[r-now+1].pb(node{ans1,ans2,i}); }
以上是关于后缀字典序中二分找查询串区间的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )