后缀数组求最长重复且不重叠子串。

poj 1743 传送门

洛谷 P2743 传送门

1.子串可以“变调”(即1 3 6和3 5 8视作相同)。解决办法:求字符串相邻元素的差形成新串。用新字符串求解最长重复子串即可。

2.最长重复子串不能重叠。解决办法:用sa数组判断开始位置。

倍增答案即可,从1到n枚举height,记录子串开始的最左端、最右端。

如果找到了两个后缀,其公共前缀长度大于k,且其开始位置之间的间隔大于k,就满足条件。

由height数组的性质可得:要使x、y的公共前缀长度大于k,则需要h[x+1]、h[x+2]......h[y]全部大于k。

所以只要有一个没有大于k,就得重新开始。即:重置子串开始的最左端、最右端。

最后答案需要+1,并判断是否大于等于5(题意要求)。

注意poj的数据范围比洛谷上大,而且有多组测试数据。

下面只给出poj1743的代码。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 int n,ans;
 7 int s[20005];
 8 int sa[20005],rk[20005];
 9 int tr[20005],h[20005];
10
11 int cmp(int x,int y,int k)
12 {
13     if(x+k>n||y+k>n)return 0;
14     return rk[x]==rk[y]&&rk[x+k]==rk[y+k];
15 }
16
17 void cal()
18 {
19     int i,cnt;
20     for(i=1;i<=n;i++)h[s[i]]++;
21     for(cnt=0,i=1;i<=200;i++)if(h[i])tr[i]=++cnt;
22     for(i=1;i<=200;i++)h[i]+=h[i-1];
23     for(i=1;i<=n;i++)rk[i]=tr[s[i]],sa[h[s[i]]--]=i;
24     for(int k=1;cnt!=n;k<<=1)
25     {
26         for(i=1;i<=n;i++)h[i]=0;
27         for(i=1;i<=n;i++)h[rk[i]]++;
28         for(i=1;i<=n;i++)h[i]+=h[i-1];
29         for(i=n;i;i--)if(sa[i]>k)tr[sa[i]-k]=h[rk[sa[i]-k]]--;
30         for(i=1;i<=k;i++)tr[n-i+1]=h[rk[n-i+1]]--;
31         for(i=1;i<=n;i++)sa[tr[i]]=i;
32         for(cnt=0,i=1;i<=n;i++)tr[sa[i]]=cmp(sa[i],sa[i-1],k)?cnt:++cnt;
33         for(i=1;i<=n;i++)rk[i]=tr[i];
34     }
35     for(i=1;i<=n;i++)h[i]=0;
36     for(i=1;i<=n;i++)
37     {
38         if(rk[i]==1)continue;
39         for(int j=max(1,h[rk[i-1]]-1);;j++)
40         {
41             if(s[i+j-1]==s[sa[rk[i]-1]+j-1])h[rk[i]]=j;
42             else break;
43         }
44     }
45 }
46
47 int check(int k)
48 {
49     if(k>n)return 0;
50     int l,r;
51     l=r=sa[1];
52     for(int i=2;i<=n;i++)
53     {
54         if(h[i]>=k)
55         {
56             l=min(l,sa[i]);
57             r=max(r,sa[i]);
58             if(r-l>k)return 1;
59         }else l=r=sa[i];
60     }
61     return 0;
62 }
63
64 int main()
65 {
66     scanf("%d",&n);
67     while(n)
68     {
69         memset(h,0,sizeof(h));
70         memset(tr,0,sizeof(tr));
71         memset(rk,0,sizeof(rk));
72         memset(sa,0,sizeof(sa));
73         ans=0;
74         for(int i=1;i<=n;i++)scanf("%d",&s[i]);
75         for(int i=1;i<n;i++)s[i]=s[i+1]-s[i]+90;
76         cal();
77         for(int i=20;i>=0;i--)
78             if(check(ans|(1<<i)))ans|=(1<<i);
79         ans=(ans+1)>=5?(ans+1):0;
80         printf("%d\n",ans);
81         scanf("%d",&n);
82     }
83     return 0;
84 }

转载于:https://www.cnblogs.com/eternhope/p/9714864.html

[USACO5.1] Musical Themes相关推荐

  1. 【洛谷P2743】【poj 1743】[USACO5.1]乐曲主题Musical Themes

    题目 还是板子题 因为旋律会同时加减一个数,所以我们在差分数组上做就好了 注意因为差分了,跨越的个数要少一个 基数排序循环写反了,调了好久 qwq /* @Date : 2019-07-19 10:1 ...

  2. 学校作业-Usaco DP水题

    好吧,因为USACO挂掉了,所以我写的所有代码都不保证正确性[好的,这么简单的题,再不写对,你就可以滚粗了! 第一题是USACO 2.2.2 ★Subset Sums 集合  对于从 1 到 N 的连 ...

  3. 网页显示 :mad:_在网页上写乐谱:基础

    网页显示 :mad: The final project in my 1st year web development class is to design and develop a site to ...

  4. luogu P1345 [USACO5.4]奶牛的电信Telecowmunication(建图技巧 - “割点”模板 、最小割)

    P1345 [USACO5.4]奶牛的电信Telecowmunication 最小割,我们建立一个超级源点和超级汇点,做一下最小割,即可得到通过割边使得整张图变成两个完全不相连的集合的最小花费. 同样 ...

  5. 【缩点】解题报告:luogu P2746 [USACO5.3]校园网Network of Schools(有向图、强连通分量、缩点)

    题目链接:P2746 [USACO5.3]校园网Network of Schools 用tarjan算法求出强连通分量,并且缩点,如果缩点后只有一个点,则答案为1,0 对于第一问,如果缩点后某一点的入 ...

  6. android 常用 style,Android中 Styles和Themes

    部分内容摘自: http://blog.csdn.net/woshishushangdezhu/article/details/4602597 1.什么是Style,什么是Theme? 1) Styl ...

  7. 洛谷P1709 [USACO5.5]隐藏口令Hidden Password

    P1709 [USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<= ...

  8. ASP.NET 2.0(C#) - Themes(主题)

    原文链接:http://www.netfocus.cn/article1648.html 作者:webabcd 介绍 使用 ASP.NET 2.0 的"主题"功能,可以将样式和布局 ...

  9. 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)

    P2746 [USACO5.3]校园网Network of Schools https://www.luogu.org/problem/P2746 题目描述 一些学校连入一个电脑网络.那些学校已订立了 ...

最新文章

  1. nx set 怎么实现的原子性_基于Redis的分布式锁实现
  2. exchange 2013设置分层通讯簿(HAB)
  3. ios 苹果审核常见被拒问题
  4. Selenium2(WebDriver)开发环境搭建(java版)
  5. 实际中的WebRTC:STUN,TURN以及信令(五)
  6. OpenCV3 识别图中表格-JAVA 实现
  7. 使用find 命令执行命令 -exec
  8. require js
  9. axios学习笔记(一):学习HTTP相关的技术知识点
  10. 计算机组成原理试题 t4,计算机组成原理(四版)本科生试题库整理附答案
  11. 51 -算法 -斐波拉奇数列 -LeetCode 70 -递推
  12. C++ 初识类与对象
  13. microsoftstore连不上网_win10系统下微软商店连不了网如何解决
  14. 【缺陷识别】基于matlab GUI SVM金属表面缺陷分类与测量(带面板)【含Matlab源码 1652期】
  15. java程序开发的简历_Java程序开发工作简历
  16. 转速开环恒压频比异步电动机调速系统仿真
  17. 怎么知道局域网内其他设备的IP
  18. 对互联网产品运营的理解
  19. 用计算机核裂变模拟实验,SAS和蒙特卡罗模拟(1):开篇
  20. web2.0中流行的设计元素:颜色

热门文章

  1. maven项目的pom文件中常用的简单的标签理解
  2. linux7.0 端口占用,Windows 7如何处理 80端口被占用
  3. Java常用算法二:分治法
  4. 词法分析 有穷自动机
  5. 常见的INI(PHP)配置
  6. bzoj 1085: [SCOI2005]骑士精神(IDA*)
  7. “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛Problem G: 蛤玮点菜
  8. 适合于图像处理方向的SCI期刊杂志列表【转】
  9. pytorch 生成随机数Tensor的方法 torch.rand torch.randn torch.normal torch.linespace
  10. python机器学习案例系列教程——关联分析(Apriori、FP-growth)