The little cat is majoring in physics in the capital of Byterland. A piece of sad news comes to him these days: his mother is getting ill. Being worried about spending so much on railway tickets (Byterland is such a big country, and he has to spend 16 shours on train to his hometown), he decided only to send SMS with his mother.


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

Two strings with lowercase letters on two of the input lines individually. Number of characters in each one will never exceed 100000.

Output

A single line with a single integer number – what is the maximum length of the original text written by the little cat.

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 后缀数组的更多相关文章

  1. POJ 2774 后缀数组

    题目链接:http://poj.org/problem?id=2774 题意:给定两个只含小写字母的字符串,求字符串的最长公共子串长度. 思路:根据<<后缀数组——处理字符串的有力工具&g ...

  2. POJ 2774 后缀数组 || 二分+哈希

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 35607   Accepted: 14 ...

  3. POJ 2774 后缀数组:查找最长公共子

    思考:其实很easy.就在两个串在一起.通过一个特殊字符,中间分隔,然后找到后缀数组的最长的公共前缀.然后在两个不同的串,最长是最长的公共子串. 注意的是:用第一个字符串来推断是不是在同一个字符中,刚 ...

  4. POJ 2774 (后缀数组 最长公共字串) Long Long Message

    用一个特殊字符将两个字符串连接起来,然后找最大的height,而且要求这两个相邻的后缀的第一个字符不能在同一个字符串中. #include <cstdio> #include <cs ...

  5. poj 2774 后缀数组 两个字符串的最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 31904   Accepted: 12 ...

  6. [poj 2274]后缀数组+最长公共子串

    题目链接:http://poj.org/problem?id=2774 后缀数组真的太强大了,原本dp是O(nm)的复杂度,在这里只需要O(n+m). 做法:将两个串中间夹一个未出现过的字符接起来,然 ...

  7. poj 3693 后缀数组 重复次数最多的连续重复子串

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8669   Acc ...

  8. POJ - 2774~POJ - 3415 后缀数组求解公共字串问题

    POJ - 2774: 题意: 求解A,B串的最长公共字串 (摘自罗穗骞的国家集训队论文): 算法分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀. 求 A 和 B 的最长 公共子串等价于求 ...

  9. POJ 3415 后缀数组

    题目链接:http://poj.org/problem?id=3415 题意:给定2个串[A串和B串],求两个串公共子串长度大于等于k的个数. 思路:首先是两个字符串的问题.所以想用一个'#'把两个字 ...

随机推荐

  1. 当Django设置DEBUG为False时,发现admin和html的静态资源文件加载失败的解决办法

    当Django设置DEBUG为False时,发现admin和html的静态资源文件加载失败,折腾一段时间终于找到解决办法: 1.先在setting文件增加BASE_DIR(项目的路径) BASE_DI ...

  2. 【EXPDP/IMPDP】ORACLE数据泵导入导出案例(expdp & impdp)

    概要: 因项目需要,通常需要将生产库下的部分数据抽取并恢复到测试库上 本文主要介绍数据泵导入导出的几种情况以及错误处理 案例环境: rhel-server-6.5-x86_64 oracle 11.2 ...

  3. PAT练习num3-跟奥巴马一起学编程

    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝"计算机科学教育周"正式启动,奥巴马编写了很简单的计算机 ...

  4. Android根据pdf模板生成pdf文件

    我们需要生成一些固定格式的pdf文件或者一些报表数据,那么我们可以用 iText包去做. 需要包含的jar包:iText-5.0.6.jar    iTextAsian.jar ,怎样jar包导入工程 ...

  5. 在.NET Core 中实现健康检查

    .NET Core中提供了开箱即用的运行状况检查,首先,我将在.NET Core API应用程序中执行运行状况检查,接下来,我们将使用DbContext集成SQL Server或数据库的运行状况检查, ...

  6. atlas读写分离

    Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug ...

  7. libuv中实现tcp服务器

    目录 1.说明 2.libuv的tcp server 3.API简介 3.1.uv_tcp_init 3.2.uv_ip4_addr 3.3.uv_tcp_bind 3.4.uv_listen 3.5 ...

  8. Spring Security OAuth2.0认证授权六:前后端分离下的登录授权

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  9. threading.RLock()

    # Copyright 2001-2017 by Vinay Sajip. All Rights Reserved.## Permission to use, copy, modify, and di ...

  10. Obligations for calling close() on the iterable returned by a WSGI application

    Graham Dumpleton: Obligations for calling close() on the iterable returned by a WSGI application. ht ...