超级恶心,先后用set维护right,再用主席树维护,全部超时,本地测是AC的。放心,BZOJ上还是1S限制,貌似只有常数优化到一定境界的人才能AC吧。

  总之我是精神胜利了哦耶QAQ

 #include <iostream>
#include <cstring>
#include <cstdio>
#define lb lower_bound
#define ub upper_bound
#include <set>
using namespace std;
const int N=;
int fa[N][],ch[N][],len[N],pos[N];
int lst,cnt;set<int>t[N];
int n,Q,a,b,c,d;char s[N];
void Init(){lst=cnt=;}
void Insert(int c){
int p=lst,np=lst=++cnt;len[np]=len[p]+;
while(p&&ch[p][c]==)ch[p][c]=np,p=fa[p][];
if(!p)fa[np][]=;
else{
int q=ch[p][c],nq;
if(len[q]==len[p]+)fa[np][]=q;
else{
len[nq=++cnt]=len[p]+;
fa[nq][]=fa[q][];fa[q][]=fa[np][]=nq;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
while(ch[p][c]==q)ch[p][c]=nq,p=fa[p][];
}
}
}
int cntE,fir[N],to[N],nxt[N];
void addedge(int a,int b){
nxt[++cntE]=fir[a];
to[fir[a]=cntE]=b;
} set<int>Merge(set<int>x,set<int>y){
if(x.size()<y.size())swap(x,y);
x.insert(y.begin(),y.end());
//delete &y;
return x;
} void DFS(int x){
for(int i=fir[x];i;i=nxt[i])
DFS(to[i]),t[x]=Merge(t[x],t[to[i]]);
} bool Judge(int p,int l,int r){
return t[p].lb(l)!=t[p].ub(r);
} int Find(int x,int l){
for(int i=;i>=;i--)
if(fa[x][i]&&len[fa[x][i]]>=l)
x=fa[x][i];
return x;
} int Solve(){
int l=,r=min(d-c,b-a)+;
while(l<=r){
int mid=(l+r)>>;
int p=Find(pos[c],mid);
if(Judge(p,a,b-mid+))l=mid+;
else r=mid-;
}
return r;
} int main(){
freopen("heoi2016_str5.in","r",stdin);
freopen("heoi2016_str.out","w",stdout);
Init();scanf("%d%d%s",&n,&Q,s+);
for(int i=n;i>=;i--){Insert(s[i]-'a');t[pos[i]=lst].insert(i);}
for(int i=;i<=cnt;i++)addedge(fa[i][],i);DFS();
for(int k=;k<=;k++)
for(int i=;i<=cnt;i++)
fa[i][k]=fa[fa[i][k-]][k-];
while(Q --){
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("%d\n",Solve());
}
return ;
}

  然后是应该AC的:

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <ctime>
using namespace std;
const int N=;
int fa[N][],ch[N][],len[N],pos[N];
int lst,cnt,n,Q;char s[N];
void Init(){lst=cnt=;}
void Insert(int c){
int p=lst,np=lst=++cnt;len[np]=len[p]+;
while(p&&ch[p][c]==)ch[p][c]=np,p=fa[p][];
if(!p)fa[np][]=;
else{
int q=ch[p][c],nq;
if(len[q]==len[p]+)fa[np][]=q;
else{
len[nq=++cnt]=len[p]+;
fa[nq][]=fa[q][];fa[q][]=fa[np][]=nq;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
while(ch[p][c]==q)ch[p][c]=nq,p=fa[p][];
}
}
}
int cntE,fir[N],to[N],nxt[N];
void addedge(int a,int b){
nxt[++cntE]=fir[a];
to[fir[a]=cntE]=b;
} int id[N],ed[N],tot;
int rt[N],sum[N*],son[N*][];
void Insert(int pre,int &rt,int l,int r,int g){
sum[rt=++tot]=sum[pre]+;
son[rt][]=son[pre][];
son[rt][]=son[pre][];
if(l==r)return;int mid=l+r>>;
if(mid>=g)Insert(son[pre][],son[rt][],l,mid,g);
else Insert(son[pre][],son[rt][],mid+,r,g);
}
int Query(int x,int l,int r,int a,int b){
if(l>=a&&r<=b||!sum[x])return sum[x];
int ret=,mid=l+r>>;
if(mid>=a)ret=Query(son[x][],l,mid,a,b);
if(mid<b)ret+=Query(son[x][],mid+,r,a,b);
return ret;
} bool Judge(int p,int l,int r){
int A=Query(rt[l-],,cnt,id[p],ed[p]);
int B=Query(rt[r],,cnt,id[p],ed[p]);
return A<B;
} int st[N],top;
int main(){
freopen("heoi2016_str.in","r",stdin);
freopen("heoi2016_str.out","w",stdout);
Init();scanf("%d%d%s",&n,&Q,s+);
for(int i=n;i>=;i--)Insert(s[i]-'a'),pos[i]=lst;
for(int i=;i<=cnt;i++)addedge(fa[i][],i);
for(int k=;k<=;k++)for(int i=;i<=cnt;i++)
fa[i][k]=fa[fa[i][k-]][k-];
st[top=]=;
while(top){
int x=st[top];
if(id[x]){ed[x]=tot;top--;}
else{
id[x]=++tot;
for(int i=fir[x];i;i=nxt[i])
st[++top]=to[i];
}
} tot=;
for(int i=;i<=n;i++)
Insert(rt[i-],rt[i],,cnt,id[pos[i]]);
int a,b,c,d;
while(Q --){
scanf("%d%d%d%d",&a,&b,&c,&d);
int l=,r=min(d-c,b-a)+;
while(l<=r){
int mid=l+r>>,p=pos[c];
for(int i=;i>=;i--)
if(fa[p][i]&&len[fa[p][i]]>=mid)
p=fa[p][i];
if(Judge(p,a,b-mid+))l=mid+;
else r=mid-;
}
printf("%d\n",r);
}
//printf("%lf\n", (double)clock()/CLOCKS_PER_SEC);
return ;
}

  有毒啊,后缀数组都写挂了,TLE。

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=;
int n,Q,r[N],Wa[N],Wb[N],Wv[N],Ws[N];
int rk[N],sa[N],lcp[N],mm[N],Min[N][];
int len,cnt,ch[N*][],sum[N*],rt[N];
char s[N];
bool cmp(int *p,int i,int j,int l){
return p[i]==p[j]&&p[i+l]==p[j+l];
} void DA(int n,int m){
int i,j,p,*x=Wa,*y=Wb;
for(i=;i<m;i++)Ws[i]=;
for(i=;i<n;i++)++Ws[x[i]=r[i]];
for(i=;i<m;i++)Ws[i]+=Ws[i-];
for(i=n-;i>=;i--)sa[--Ws[x[i]]]=i; for(p=,j=;p<n;m=p,j<<=){
for(p=,i=n-j;i<n;i++)y[p++]=i;
for(i=;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j;
for(i=;i<m;i++)Ws[i]=;
for(i=;i<n;i++)++Ws[Wv[i]=x[y[i]]];
for(i=;i<m;i++)Ws[i]+=Ws[i-];
for(i=n-;i>=;i--)sa[--Ws[Wv[i]]]=y[i];
for(swap(x,y),x[sa[]]=,i=,p=;i<n;i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
} void LCP(int n){
int i,j,k=;
for(i=;i<=n;i++)rk[sa[i]]=i;
for(i=;i<n;lcp[rk[i++]]=k)
for(k-=k>,j=sa[rk[i]-];r[i+k]==r[j+k];k++);
} #define mid ((l+r)>>1)
void Insert(int pre,int &rt,int l,int r,int g,int d){
sum[rt=++cnt]=sum[pre]+d;ch[rt][]=ch[pre][];
ch[rt][]=ch[pre][];if(l==r)return;
if(mid>=g)Insert(ch[pre][],ch[rt][],l,mid,g,d);
else Insert(ch[pre][],ch[rt][],mid+,r,g,d);
} int Query(int pre,int rt,int l,int r,int a,int b){
if(l>=a&&r<=b)return sum[rt]-sum[pre];int ret=;
if(mid>=a)ret=Query(ch[pre][],ch[rt][],l,mid,a,b);
if(mid<b)ret+=Query(ch[pre][],ch[rt][],mid+,r,a,b);
return ret;
} void Prepare(int n){
mm[]=-;
for(int i=;i<=n;i++){
mm[i]=mm[i-];
if(!(i&i-))mm[i]+=;
Min[i][]=lcp[i];
}
for(int k=;k<=mm[n];k++)
for(int i=;i+(<<k-)<=n;i++)
Min[i][k]=min(Min[i][k-],Min[i+(<<k-)][k-]);
} int Qmin(int x,int y){
if(x>y)swap(x,y);x+=;int l=mm[y-x+];
return min(Min[x][l],Min[y-(<<l)+][l]);
} int a,b,c,d,lo,hi;
bool Check(int x,int n){
int l=,r=rk[c-]-,pl,pr;
while(l<=r){
if(Qmin(mid,rk[c-])>=x)r=mid-;
else l=mid+;
}pl=l;
l=rk[c-]+,r=n;
while(l<=r){
if(Qmin(rk[c-],mid)>=x)l=mid+;
else r=mid-;
}pr=r;
return Query(rt[pl-],rt[pr],,n,a,b-x+);
} int main(){
freopen("heoi2016_str.in","r",stdin);
freopen("heoi2016_str.out","w",stdout);
scanf("%d%d%s",&n,&Q,s);
for(;s[len];len++)r[len]=s[len];
DA(len+,);LCP(len);Prepare(len);
for(int i=;i<=len;i++)
Insert(rt[i-],rt[i],,len,sa[i]+,);
while(Q--){
scanf("%d%d%d%d",&a,&b,&c,&d);
lo=,hi=min(b-a+,d-c+);
while(lo<=hi){
int MID=(lo+hi)>>;
if(Check(MID,len))lo=MID+;
else hi=MID-;
}
printf("%d\n",hi);
}
return ;
}

字符串[未AC](后缀自动机):HEOI 2016 str的更多相关文章

  1. 【BZOJ1396】识别子串&【BZOJ2865】字符串识别(后缀自动机)

    [BZOJ1396]识别子串&[BZOJ2865]字符串识别(后缀自动机) 题面 自从有了DBZOJ 终于有地方交权限题了 题解 很明显,只出现了一次的串 在\(SAM\)的\(right/e ...

  2. LOJ3049 [十二省联考2019] 字符串问题 【后缀自动机】【倍增】【拓扑排序】

    题目分析: 建出后缀自动机,然后把A串用倍增定位到后缀自动机上,再把B串用倍增定位到后缀自动机上. SAM上每个点上的A串根据长度从小到大排序,建点,依次连边. 再对于SAM上面每个点,连到儿子的边, ...

  3. 2020牛客暑期多校训练营(第四场) C - Count New String (字符串,广义后缀自动机,序列自动机)

    Count New String 题意: 定义字符串函数 \(f(S,x,y)(1\le x\le y\le n)\),返回一个长度为y-x+1的字符串,第 i 位是 \(max_{i=x...x+k ...

  4. BZOJ3473 字符串 【广义后缀自动机】

    题目 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? 输入格式 第一行两个整数n,k. 接下来n行每行一个字符串. 输出格式 一行n个整数,第i个整数表 ...

  5. 字符串(多串后缀自动机):HDU 4436 str2int

    str2int Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  6. BZOJ 3473: 字符串 (广义后缀自动机)

    /* 广义后缀自动机, 每次加入维护 该right集合的set, 然后可以更新所有的parent,最终能够出现在k个串中right集合也就是set大小大于等于k的部分 这样的话就给了我们要跳的节点加了 ...

  7. 【BZOJ3756】Pty的字符串(广义后缀自动机)

    题意: 思路:论文题 建立Trie树的后缀自动机需要换这个长的板子 #include<bits/stdc++.h> using namespace std; typedef long lo ...

  8. 【BZOJ3473&BZOJ3277】字符串(广义后缀自动机)

    题意:给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? 本质相同的子串算多个. 对于 100% 的数据,1<=n,k<=10^5,所有字符串总 ...

  9. 字符串(广义后缀自动机):BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 843  Solved: 510[Submit][St ...

随机推荐

  1. Linux试玩指令开机关机

    Linux内核最初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和U ...

  2. .net 安装Swagger

    官网:http://swagger.io/ 教程:http://www.wmpratt.com/swagger-and-asp-net-web-api-part-1/ 1:安装Dll: https:/ ...

  3. EntityFrameowk6.1 使用enum和低版本的不同

    原有项目中使用EF5.0 实体类 public partial class Log : BaseEntity { public Nullable<int> LogLevelId { get ...

  4. 直接修改workspace下的配置文件与tomcat下的文件

    项目中直接修改workspace下的配置文件与tomcat下的文件,可是还有错误,例如修改了4个配置文件中的一个配置文件.经查如下: 直接修改workspace下的配置文件与tomcat下的文件,可能 ...

  5. awr相关指标解析

    awr相关指标解析 2016年11月11日 15:09

  6. iOS菜鸟之FMDB的二次封装简单易用

    闲来无事写点东西,希望大家多多指正! 大家先去git下载FMDB,然后将其中source文件夹中的fmdb文件夹拖入自己的项目中.最后就可以引用下面的代码对fmdb进行一次简单的封装. 这样可以更直观 ...

  7. ID选择器

    在很多方面,ID选择器都类似于类选择符,但也有一些重要的区别: 1.为标签设置id="ID名称",而不是class="类名称". 2.ID选择符的前面是井号(# ...

  8. PHP: 使用CURL访问FTP

    今天要做FTP上传.本想用PHP自带的FTP函数来实现,结果发现这个模块没有编译进来,重新编译PHP太麻烦,改用其他方式实现吧  FTP上传 if (isset($_POST['Submit'])) ...

  9. GPUImage 自定义滤镜

    GPUImage 自定义滤镜 GPUImage 是一个基于 GPU 图像和视频处理的开源 iOS 框架.由于使用 GPU 来处理图像和视频,所以速度非常快,它的作者 BradLarson 称在 iPh ...

  10. HTML DOM(一):认识DOM

     分类: HTML/JavaScript/CSS(10)  版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/ghsau. 什么是DOM?       通过 Jav ...