思路肯定是没有问题,但是不知道为啥一直 TLE 两个点~

#include <bits/stdc++.h>
#define N 2000006
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
multiset<int>id,len;
multiset<int>::iterator it;
int arr[N],st[N],length[N],idxx[N],n,m=120;
char str[N];
namespace SA
{
int rk[N], tp[N], tax[N], sa[N], height[N], Log[N], dp[N][22];
void qsort()
{
for(int i=0;i<=m;++i) tax[i]=0;
for(int i=1;i<=n;++i) ++tax[rk[i]];
for(int i=1;i<=m;++i) tax[i]+=tax[i-1];
for(int i=n;i>=1;--i) sa[tax[rk[tp[i]]]--]=tp[i];
}
void construct()
{
for(int i=1;i<=n;++i) rk[i]=arr[i],tp[i]=i;
qsort();
for(int k=1;k<=n;k<<=1)
{
int p=0;
for(int i=n-k+1;i<=n;++i) tp[++p]=i;
for(int i=1;i<=n;++i) if(sa[i]>k) tp[++p]=sa[i]-k;
qsort(), swap(tp,rk), rk[sa[1]]=p=1;
for(int i=2;i<=n;++i)
rk[sa[i]]=(tp[sa[i-1]]==tp[sa[i]]&&tp[sa[i-1]+k]==tp[sa[i]+k])?p:++p;
if(p==n) break;
m=p;
}
int k=0;
for(int i=1;i<=n;++i) rk[sa[i]]=i;
for(int i=1;i<=n;++i)
{
if(k)--k;
int j=sa[rk[i]-1];
while(arr[i+k]==arr[j+k])++k;
height[rk[i]]=k;
}
}
void RMQ()
{
for(int i=2;i<=n;++i) Log[i]=Log[i>>1]+1;
for(int i=1;i<=n;++i) dp[i][0]=height[i];
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i+(1<<j)-1<=n;++i)
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
inline int getmin(int a,int b)
{
int k=Log[b-a+1];
return min(dp[a][k],dp[b-(1<<k)+1][k]);
}
};
int main()
{
int i,j,pp,nn,q;
// setIO("input");
scanf("%d",&pp);
for(i=1;i<=pp;++i)
{
scanf("%s",str+1);
nn=strlen(str+1);
st[i]=n+1;
for(j=1;j<=nn;++j) arr[++n]=str[j]-'a'+1;
arr[++n]=30;
}
SA::construct();
SA::RMQ();
scanf("%d",&q);
for(i=1;i<=q;++i)
{
int opt;
scanf("%d",&opt);
if(opt==1)
{
int x,l,r,tmp;
scanf("%d%d%d",&x,&l,&r); tmp=st[x]+l-1;
idxx[i]=SA::rk[tmp];
length[i]=r-l+1; id.insert(idxx[i]);
len.insert(r-l+1); int a=(*id.begin()),b=(*(--id.end())); if(a==b)
{
printf("%d\n",*len.begin());
}
else
{
printf("%d\n",min(*len.begin(),SA::getmin(a+1,b)));
}
}
else
{
int k;
scanf("%d",&k); len.erase(len.lower_bound(length[k]));
id.erase(id.lower_bound(idxx[k])); if(len.empty())
{
printf("0\n");
continue;
} int a=(*id.begin()),b=(*(--id.end())); if(a==b)
{
printf("%d\n",*len.begin());
}
else
{
printf("%d\n",min(*len.begin(),SA::getmin(a+1,b)));
}
}
}
return 0;
}

  

最新文章

  1. js,jq,css选择器
  2. 精通CSS version2笔记2.小知识
  3. Docker-数据卷和数据容器卷
  4. bzoj1312
  5. sql执行计划
  6. IDEA12 KeyGen Download List
  7. DDGScreenShot—截取图片的任意部分
  8. AutoField的话就报错:&#39;AutoField&#39; object has no attribute &#39;rel&#39;
  9. 环境搭建--使用pytharm远程调试树莓派
  10. hadoop HDFS常用文件操作命令
  11. BZOJ.3453.tyvj 1858 XLkxc(拉格朗日插值)
  12. C# OpenFileDialog打开文件对话框(详解)
  13. java中的数据加密3 非对称加密
  14. POJ 3461 Oulipo(KMP裸题)
  15. spring中注册bean(通过代码动态注册)
  16. JAVA eclipse 安装lombok
  17. AtCoder Grand Contest 030 Solution
  18. Python安装安装.whl包(安装pylint)
  19. C#学习笔记14
  20. InnoDB高并发原理

热门文章

  1. C语言基础练习——最大值及其位置(二维数组)
  2. php 连接sqlserver
  3. 经验:什么影响了数据库查询速度、什么影响了MySQL性能 (转)
  4. SQLServer 导入大容量sql文件
  5. 怎样使用 ssh 命令远程连接服务器?
  6. javascript中的所有内容都是一个对象:字符串、值、数组、函数…
  7. vue2中的keep-alive使用总结及注意事项
  8. Google 开源的 Python 命令行库:初探 fire
  9. Photoshop从入门到精通所有视频教程(43G)以及素材资料免费拿
  10. java_day07_异常