Long Long Message POJ - 2774 后缀数组
The little cat lives in an unrich family, so he frequently comes to the mobile service center, to check how much money he has spent on SMS. Yesterday, the computer of service center was broken, and printed two very long messages. The brilliant little cat soon found out:
1. All characters in messages are lowercase Latin letters, without punctuations and spaces.
2. All SMS has been appended to each other – (i+1)-th SMS comes directly after the i-th one – that is why those two messages are quite long.
3. His own SMS has been appended together, but possibly a great many redundancy characters appear leftwards and rightwards due to the broken computer.
E.g: if his SMS is “motheriloveyou”, either long message printed by that machine, would possibly be one of “hahamotheriloveyou”, “motheriloveyoureally”, “motheriloveyouornot”, “bbbmotheriloveyouaaa”, etc.
4. For these broken issues, the little cat has printed his original text twice (so there appears two very long messages). Even though the original text remains the same in two printed messages, the redundancy characters on both sides would be possibly different.
You are given those two very long messages, and you have to output the length of the longest possible original text written by the little cat.
Background:
The SMS in Byterland mobile service are charging in dollars-per-byte. That is why the little cat is worrying about how long could the longest original text be.
Why ask you to write a program? There are four resions:
1. The little cat is so busy these days with physics lessons;
2. The little cat wants to keep what he said to his mother seceret;
3. POJ is such a great Online Judge;
4. The little cat wants to earn some money from POJ, and try to persuade his mother to see the doctor :(
Input
Output
Sample Input
yeshowmuchiloveyoumydearmotherreallyicannotbelieveit
yeaphowmuchiloveyoumydearmother
Sample Output
27
题意:
题目这么长就是说,给你两个串,你需要找出来两个串的最长公共部分(听着好像dp的一种最长公共子序列,复杂度nlog(n),不知道做这道题可不可以,应该会TLE)
题解:
你把这两个串连在一起然后找出来所有满足下面条件的所有height[i]的值,取最大那个输出
height[i]就表示排名第i和排名第i-1的后缀最长公共前缀,如果这两个后缀不属于一个串,那么这个长度就可以满足题意,又因为题目让我们找最大的,所以遍历一遍即可
代码:
1 #include <cstdlib>
2 #include <cstring>
3 #include <cstdio>
4 #include <algorithm>
5 using namespace std;
6
7 const int N = 200010;
8 int x[N], y[N], c[N];
9 int rank[N], height[N];
10 int sa[N],s[N],n,k;
11 char str1[N],str2[N];
12 bool pan(int *x,int i,int j,int k,int n)
13 {
14 int ti=i+k<n?x[i+k]:-1;
15 int tj=j+k<n?x[j+k]:-1;
16 return x[i]==x[j]&&ti==tj;
17 }
18 void build_SA(int n,int r)
19 {
20 int *x=rank,*y=height;
21 for(int i=0; i<r; i++)c[i]=0;
22 for(int i=0; i<n; i++)c[s[i]]++;
23 for(int i=1; i<r; i++)c[i]+=c[i-1];
24 for(int i=n-1; i>=0; i--)sa[--c[s[i]]]=i;
25 r=1;
26 x[sa[0]]=0;
27 for(int i=1; i<n; i++)
28 x[sa[i]]=s[sa[i]]==s[sa[i-1]]?r-1:r++;
29 for(int k=1; r<n; k<<=1)
30 {
31 int yn=0;
32 for(int i=n-k; i<n; i++)y[yn++]=i;
33 for(int i=0; i<n; i++)
34 if(sa[i]>=k)y[yn++]=sa[i]-k;
35 for(int i=0; i<r; i++)c[i]=0;
36 for(int i=0; i<n; i++)++c[x[y[i]]];
37 for(int i=1; i<r; i++)c[i]+=c[i-1];
38 for(int i=n-1; i>=0; i--)sa[--c[x[y[i]]]]=y[i];
39 swap(x,y);
40 r=1;
41 x[sa[0]]=0;
42 for(int i=1; i<n; i++)
43 x[sa[i]]=pan(y,sa[i],sa[i-1],k,n)?r-1:r++;
44 }
45 for(int i=0; i<n; i++)rank[i]=x[i];
46 }
47 void get_height(int n)
48 {
49 int i,j,k=0;
50 for(i=1; i<=n; i++)rank[sa[i]]=i;
51 for(i=0; i<n; i++)
52 {
53 if(k)k--;
54 else k=0;
55 j=sa[rank[i]-1];
56 while(s[i+k]==s[j+k])k++;
57 height[rank[i]]=k;
58 }
59 }
60 int main()
61 {
62 scanf("%s%s",str1,str2);
63 int len=strlen(str1);
64 n=0;
65 for(int i=0;i<len;++i)
66 s[n++]=str1[i];
67 len=strlen(str2);
68 for(int j=0;j<len;++j)
69 s[n++]=str2[j];
70 s[n]='0';
71
72 build_SA(n+1,N);
73 get_height(n);
74 len=strlen(str1);
75 int maxx=0;
76 for(int i=2;i<=n;++i)
77 {
78 if(maxx<height[i])
79 {
80 if((sa[i]<len && sa[i-1]<len) || (sa[i]>=len && sa[i-1]>=len))
81 continue;
82 else maxx=height[i];
83 }
84 }
85 printf("%d\n",maxx);
86 return 0;
87 }
Long Long Message POJ - 2774 后缀数组的更多相关文章
- POJ 2774 后缀数组
题目链接:http://poj.org/problem?id=2774 题意:给定两个只含小写字母的字符串,求字符串的最长公共子串长度. 思路:根据<<后缀数组——处理字符串的有力工具&g ...
- POJ 2774 后缀数组 || 二分+哈希
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 35607 Accepted: 14 ...
- POJ 2774 后缀数组:查找最长公共子
思考:其实很easy.就在两个串在一起.通过一个特殊字符,中间分隔,然后找到后缀数组的最长的公共前缀.然后在两个不同的串,最长是最长的公共子串. 注意的是:用第一个字符串来推断是不是在同一个字符中,刚 ...
- POJ 2774 (后缀数组 最长公共字串) Long Long Message
用一个特殊字符将两个字符串连接起来,然后找最大的height,而且要求这两个相邻的后缀的第一个字符不能在同一个字符串中. #include <cstdio> #include <cs ...
- poj 2774 后缀数组 两个字符串的最长公共子串
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 31904 Accepted: 12 ...
- [poj 2274]后缀数组+最长公共子串
题目链接:http://poj.org/problem?id=2774 后缀数组真的太强大了,原本dp是O(nm)的复杂度,在这里只需要O(n+m). 做法:将两个串中间夹一个未出现过的字符接起来,然 ...
- poj 3693 后缀数组 重复次数最多的连续重复子串
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8669 Acc ...
- POJ - 2774~POJ - 3415 后缀数组求解公共字串问题
POJ - 2774: 题意: 求解A,B串的最长公共字串 (摘自罗穗骞的国家集训队论文): 算法分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀. 求 A 和 B 的最长 公共子串等价于求 ...
- POJ 3415 后缀数组
题目链接:http://poj.org/problem?id=3415 题意:给定2个串[A串和B串],求两个串公共子串长度大于等于k的个数. 思路:首先是两个字符串的问题.所以想用一个'#'把两个字 ...
随机推荐
- Go中由WaitGroup引发对内存对齐思考
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 WaitGroup使用大家都会,但是其中是怎么实现的我们 ...
- 翻译 - ASP.NET Core 托管和部署 - 在 Linux 上使用 Nginx 托管 ASP.NET Core 网站
翻译自 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-5.0 本文介 ...
- 【win10】win10下两个显示器不同桌面壁纸
win10系统下,双屏显示为不同的桌面壁纸 操作: 1.鼠标右键点击个性化 2.点击背景选项 3.在图片上右键选择要添加为背景的图片 同理,将另一个屏幕壁纸设为监视器1 最后效果为两个分屏为不同桌面壁 ...
- 使用idea插件识别log文件的相关设置
最近要读一些spring boot项目产生的log文件,众所周知,idea拥有强大的插件系统.当我打开log文件时,idea自动帮我推荐了ideolog这个插件. 但是当我安装好之后发现系统并不能完全 ...
- ECharts特效-折线图上一个光点来回移动
参考地址:https://www.makeapie.com/editor.html?c=xxxcG6NGk0 效果图打开上面的网址就可以看到. 核心代码如下,该效果实现的难点是数据的封装,还有eval ...
- 集成Redis缓存
一.简介 1.场景 由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页数据缓存到redis中,减少数据库压力和提高访问速度. 2.RedisTemplate Jedis是Redi ...
- html简单基础
标签语法 标签的语法: <标签名 属性1="属性值1" 属性2="属性值2"-->内容部分</标签名> <标签名 属性1=&quo ...
- 如何封装Promise对象?
最近看到了一个有趣的Promise的方法,这里记录下来 <script> class MyPromise { constructor(executor) { // 初始化state赋值为p ...
- 【分享】每个 Web 开发者在 2021 年必须拥有 15 个 VSCode 扩展
为什么VSCode如此受欢迎 Visual Studio Code在开发人员中迅速流行起来,它是最流行的开发环境,可定制性是其流行的原因之一. 因此,如果你正在使用VSCode,这里有一个扩展列表,你 ...
- CentOS系统内核升级(在线 离线)
为什么要升级内核? Docker 在CentOS系统中需要安装在 CentOS 7 64 位的平台,并且内核版本不低于 3.10:CentOS 7.× 满足要求的最低内核版本要求,但由于 CentOS ...