博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj_1743_Musical Theme(后缀数组)
阅读量:4959 次
发布时间:2019-06-12

本文共 1210 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

给你一串数字,让你找最长的变化相同不重叠的子串,至少长度为5

题解:

处理数据后用后缀数组加二分答案,然后用height数组check答案,运用height数组求相同不重叠的子串经典运用

 

1 #include
2 #include
3 #define F(i,a,b) for(int i=a;i<=b;i++) 4 using namespace std; 5 6 namespace suffixarray{ 7 #define FN(n) for(int i=0;i
=0;i--)sa[--c[x[i]]]=i;13 for(int k=1,p;p=0,k<=n;k=p>=n?N:k<<1,m=p){14 for(int i=n-k;i
=k)y[p++]=sa[i]-k;16 FN(m)c[i]=0;FN(n)c[x[y[i]]]++;FN(m)c[i+1]+=c[i];17 for(int i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i];18 swap(x,y),p=1,x[sa[0]]=0;19 for(int i=1;i
b)a=b;}31 inline void upu(int &a,int b){
if(a
=x)39 {40 upd(l,sa[i]),upu(r,sa[i]);41 if(r-l>=x)return 1;42 }else l=r=sa[i];43 }44 return 0;45 }46 47 int main()48 {49 while(scanf("%d",&n),n)50 {51 F(i,0,n-1)scanf("%d",s+i);52 if(n<10){puts("0");continue;}53 F(i,0,n-2)s[i]=s[i+1]-s[i]+89;54 s[--n]=0,getsa(n+1,200);55 int l=4,r=n,mid;56 while(l<=r)mid=(l+r)>>1,check(mid)?l=mid+1:r=mid-1;57 printf("%d\n",l<5?0:l);58 }59 return 0;60 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/5766519.html

你可能感兴趣的文章
MYSQL数据库的导出的几种方法
查看>>
SQL Server-5种常见的约束
查看>>
硬件之美
查看>>
[转载]java开发中的23种设计模式
查看>>
表格的拖拽功能
查看>>
函数的形参和实参
查看>>
文字过长 用 ... 表示 CSS实现单行、多行文本溢出显示省略号
查看>>
1Caesar加密
查看>>
【TP SRM 703 div2 500】 GCDGraph
查看>>
MapReduce 重要组件——Recordreader组件 [转]
查看>>
webdriver api
查看>>
apache 实现图标缓存客户端
查看>>
揭秘:黑客必备的Kali Linux是什么,有哪些弊端?
查看>>
linux系统的远程控制方法——学神IT教育
查看>>
springboot+mybatis报错Invalid bound statement (not found)
查看>>
Linux环境下SolrCloud集群环境搭建关键步骤
查看>>
P3565 [POI2014]HOT-Hotels
查看>>
MongoDB的简单使用
查看>>
hdfs 命令使用
查看>>
prometheus配置
查看>>