diff --git a/CodeChef/QSTRING b/CodeChef/QSTRING new file mode 100644 index 0000000..c8a2dbf --- /dev/null +++ b/CodeChef/QSTRING @@ -0,0 +1,208 @@ +/*https://www.codechef.com/problems/QSTRING*/ +/*Jai Shree Ram🚩*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +#define ll long long +#define ull unsigned long long +#define db double +#define inf 1000000007 +#define mod 1000000007 +#define pii pair +#define vi vector +#define VS vector +#define all(x) x.begin(),x.end() +#define mp make_pair +#define pb push_back +#define x first +#define y second +#define N 1000005 +#define pi 3.14159265358979323846 +#define DBG(vari) cerr<<#vari<<"="<<(vari)<=n||j+h>=n)return 0; + return (r[i]==r[j]&&r[i+h]==r[j+h]); +} +void build(char *s) +{ + n=strlen(s);int i,j,m=128,p,k; + int *x=wa,*y=wb; + for(i=0;i<128;i++)w[i]=0; + for(i=0;i=0;i--)sa[--w[s[i]]]=i; + for(j=1;p!=n;j<<=1,m=p) + { + for(i=n-j,p=0;i=j)y[p++]=sa[i]-j; + for(i=0;i=0;i--)sa[--w[x[y[i]]]]=y[i]; + swap(x,y); + for(x[sa[0]]=0,i=1,p=1;i>1,p=++sz; + if(x<=m) + { + t[p].l=insert(t[q].l,l,m,x);t[p].r=t[q].r; + } + else + { + t[p].r=insert(t[q].r,m+1,r,x);t[p].l=t[q].l; + } + up(p); + return p; +} +int build(int l,int r) +{ + ++sz;t[sz].v=0; + if(l==r){return sz;} + int m=(l+r)>>1,p=sz; + t[p].l=build(l,m); + t[p].r=build(m+1,r); + return p; +} +int query(int p,int q,int l,int r,int x,int y) +{ + if(l>=x&&r<=y){return t[q].v-t[p].v;} + int m=(l+r)>>1,ans=0; + if(x<=m)ans=query(t[p].l,t[q].l,l,m,x,y); + if(y>m)ans+=query(t[p].r,t[q].r,m+1,r,x,y); + return ans; +} +void solve() +{ + int i,j; + for(i=0;i=n){DBG(i)DBG(x)break;} + root[i+1]=insert(root[i],0,n-1,x); + } +} +int fun(int l,int r) +{ + int h=r-l+1,i=0; + while(1<>1; + if(fun(i+1,m)>=r)L=m+1; + else R=m-1; + } + R=L-1,L=i; + int l1=0,r1=n-1; + while(l1<=r1) + { + m=(l1+r1)>>1; + int cnt=query(root[L],root[R+1],0,n-1,0,m); + if(cnt>=k2)r1=m-1; + else l1=m+1; + } + l=r1+1;r=l+r-1; + printf("%d %d\n",l+1,r+1); +} +void cal1(int l,int r) +{ + int i=rank[l],j;ll k1,k2; + int l1=0,r1=i,m,len=r-l+1; + while(l1<=r1) + { + m=(l1+r1)>>1; + if(fun(m,i)>=r-l+1)r1=m-1; + else l1=m+1; + } + j=r1; + k1=(j?f[j-1]:0)+len-lcp[j]; + int l2=i+1,r2=n-1; + while(l2<=r2) + { + m=(l2+r2)>>1; + if(fun(i+1,m)>=r-l+1)l2=m+1; + else r2=m-1; + } + int L=j,R=l2-1; + //cerr<>k1>>k2,cal(k1,k2); + else scanf("%d%d",&l,&r),l--,r--,cal1(l,r); + } + } + return 0; +}