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的个数. 思路:首先是两个字符串的问题.所以想用一个'#'把两个字 ...
随机推荐
- for update语句锁机制问题
数据库小知识学习系列 问题: MySQL InnoDB中,select where xxx=123 for update:该xxx没有索引,是使用表锁还是全部数据加行锁? 答: InnoDB引擎(默认 ...
- Python机器学习笔记:奇异值分解(SVD)算法
完整代码及其数据,请移步小编的GitHub 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/MachineLearningNote 奇异值分解(Singu ...
- Jquery实现对Array数组实现类似Linq的Lambda表达式的Where方法筛选
平时使用Linq,习惯了Lambda表达式,用着非常顺手,奈何在Jquery里面不能这样用,只能循环一个个判断.趁空闲时间找了找,自己写了这样的扩展方法.目前写出了三种方案,没有比较性能,觉得都可以用 ...
- 庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境
庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境 一.介绍 说起微服务架构来,有一个环节是少不了的,那就是CI/CD持续集成的环境.当然,搭建CI/CD环境的工具很多, ...
- Py数据类型—列表,字典,元组
列表:数据类型list. 写法li=[1,12,9,"sdsad",["ad","dd"] ].用中括号括起来,用逗号分割每个元素列表中元素 ...
- 容器化安装Mysql 8.0 并部署主从复制
系统: Centos 7.4 数据库版本:8.0.20 两台机器做相同操作 安装Docker export VERSION=18.06 && curl -fsSL http://rai ...
- linux总线
编写驱动程序: 1 #include <linux/init.h> 2 #include <linux/module.h> 3 #include <linux/devic ...
- MySQL中 utf8与utf8mb4的区别
MySQL中 utf8与utf8mb4的区别 一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.好在 ...
- hook笔记①
汇编中push 0x*** retn表示跳转到某个地址继续执行 取消hook时会在多线程环境中可能被检测 去掉函数框架可以规避寄存器cpu前后状态监测 #pragma comment(linker,& ...
- GDB查看内存命令(x命令) 用gdb查看指定地址的内存内容
GDB查看内存命令(x命令) - super119 - 博客园 https://www.cnblogs.com/super119/archive/2011/11/18/2254382.html 可以使 ...