题意:求两个串的最长公共子串

两个串连接起来然后求高度数组

注意两个sa值必须分别在不同一侧

本题是用来测试模板的,回想起青岛那次翻车感觉很糟糕

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define iin(a) scanf("%d",&a)
#define lin(a) scanf("%lld",&a)
#define din(a) scanf("%lf",&a)
#define s0(a) scanf("%s",a)
#define s1(a) scanf("%s",a+1)
#define print(a) printf("%lld",(ll)a)
#define enter putchar('\n')
#define blank putchar(' ')
#define println(a) printf("%lld\n",(ll)a)
#define IOS ios::sync_with_stdio(0)
using namespace std;
const int maxn = 1e6+11;
const int oo = 0x3f3f3f3f;
const double eps = 1e-7;
typedef long long ll;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
char str[maxn];
struct SA{
int Rank[maxn],sa[maxn],tsa[maxn],A[maxn],B[maxn];
int cntA[maxn],cntB[maxn];
int height[maxn],best[maxn][30],n;//height[i]:第sa[i]与sa[i-1]的cp
void get(){
n=strlen(str+1);
rep(i,0,300) cntA[i]=0;
rep(i,1,n) cntA[str[i]]++;
rep(i,1,300) cntA[i]+=cntA[i-1];
rrep(i,n,1) sa[cntA[str[i]]--]=i;
Rank[sa[1]]=1;
rep(i,2,n){
if(str[sa[i]]==str[sa[i-1]]){
Rank[sa[i]]=Rank[sa[i-1]];
}else{
Rank[sa[i]]=1+Rank[sa[i-1]];
}
}
for(int l=1;Rank[sa[n]]<n;l<<=1){
rep(i,1,n) cntA[i]=cntB[i]=0;
rep(i,1,n) cntA[A[i]=Rank[i]]++;
rep(i,1,n) cntB[B[i]=(i+l<=n?Rank[i+l]:0)]++;
rep(i,1,n) cntA[i]+=cntA[i-1],cntB[i]+=cntB[i-1];
rrep(i,n,1) tsa[cntB[B[i]]--]=i;
rrep(i,n,1) sa[cntA[A[tsa[i]]]--]=tsa[i];
Rank[sa[1]]=1;
rep(i,2,n){
bool flag=A[sa[i]]==A[sa[i-1]]&&B[sa[i]]==B[sa[i-1]];
flag=!flag;
Rank[sa[i]]=Rank[sa[i-1]]+flag;
}
}
}
void ht(){
int j=0;
rep(i,1,n){
if(j) j--;
while(str[i+j]==str[sa[Rank[i]-1]+j]) j++;
height[Rank[i]]=j;
}
}
void rmq(){
rep(i,1,n) best[i][0]=height[i];
for(int i=1;(1<<i)<=n;i++){
for(int j=1;j+(1<<i)-1<=n;j++){
best[j][i]=min(best[j][i-1],best[j+(1<<(i-1))][i-1]);
}
}
}
int query(int l,int r){
if(l==r)return -oo;
if(l>r)swap(l,r);
l++;
int k=log2(r-l+1);
return min(best[l][k],best[r-(1<<k)+1][k]);
}
}sa;
char str1[maxn];
int main(){
while(~s1(str)){
int len=strlen(str+1);
s1(str1);
strcat(str+1,str1+1);
sa.get();
sa.ht();
int n=strlen(str+1);
int ans=0;
for(int i = 1; i <= n; i++){
if(ans<sa.height[i]){
if((sa.sa[i]<=len&&sa.sa[i-1]>len)||(sa.sa[i]>len&&sa.sa[i-1]<=len)){
ans=sa.height[i];
}
}
}
println(ans);
}
return 0;
}

顺便贴一下学习路线:https://tieba.baidu.com/f?kz=754580296&red_tag=3176925876

最新文章

  1. 2015ACM/ICPC亚洲区长春站
  2. Unity3d Static 静态批处理和动态批处理
  3. 20140102-lua binder另一只轮子的雏形
  4. Maven(二)之Maven项目构建演练
  5. mysql 获取原数据
  6. cs224d 自然语言处理作业 problem set3 (一) 实现Recursive Nerual Net Work 递归神经网络
  7. MVC Scaffolding SmartCode-Engine 更新
  8. webpack开发环境和生产环境切换原理
  9. Pandas系列(一)-Series详解
  10. Vue添加请求拦截器
  11. 一脸懵逼学习keepalived(对Nginx进行热备)
  12. poj3889
  13. 移动端项目在ios上输入框聚焦难解决方案
  14. CSRF理解和实战
  15. 担心后端代码泄露?用delphi做后端,模板扣出来,随时可以变化。
  16. 配置Info.plist (设置状态栏样式、自定义定位时系统弹出的提示语、配置3DTouch应用快捷菜单)
  17. MySql 几个小技巧
  18. Windows下MySQL多实例运行
  19. python虚拟环境--virtualenv和virtualenvwrapper
  20. 关于filter web api mvc 权限验证 这里说的够详细了。。。

热门文章

  1. Cannot connect to the Docker datemon at tcp://0.0.0.0:2375 is the docker daemon runing?
  2. c语言实践 数字特征值
  3. Django--model模型绑定_数据库操作
  4. django: rest-framework的 分页和过滤
  5. 第一次C语言作业:博客随笔
  6. css属性position的运用
  7. WOX快速搜索
  8. 关于winform的appconfig的读写操作
  9. Java Serializable(序列化)的理解和总结
  10. C# Task的使用