ural1517之最长公共子串

原创 2013年12月03日 20:46:03


1517. Freedom of Choice

Time limit: 2.0 second
Memory limit: 64 MB

Background

Before Albanian people could bear with the freedom of speech (this story is fully described in the problem "Freedom of speech"), another freedom - the freedom of choice - came down on them. In the near future, the inhabitants will have to face the first democratic Presidential election in the history of their country.
Outstanding Albanian politicians liberal Mohammed Tahir-ogly and his old rival conservative Ahmed Kasym-bey declared their intention to compete for the high post.

Problem

According to democratic traditions, both candidates entertain with digging dirt upon each other to the cheers of their voters' approval. When occasion offers, each candidate makes an election speech, which is devoted to blaming his opponent for corruption, disrespect for the elders and terrorism affiliation. As a result the speeches of Mohammed and Ahmed have become nearly the same, and now it does not matter for the voters for whom to vote.
The third candidate, a chairman of Albanian socialist party comrade Ktulhu wants to make use of this situation. He has been lazy to write his own election speech, but noticed, that some fragments of the speeches of Mr. Tahir-ogly and Mr. Kasym-bey are completely identical. Then Mr. Ktulhu decided to take the longest identical fragment and use it as his election speech.

Input

The first line contains the integer number N (1 ≤ N ≤ 100000). The second line contains the speech of Mr. Tahir-ogly. The third line contains the speech of Mr. Kasym-bey. Each speech consists of N capital latin letters.

Output

You should output the speech of Mr. Ktulhu. If the problem has several solutions, you should output any of them.

Sample

input output
28
VOTEFORTHEGREATALBANIAFORYOU
CHOOSETHEGREATALBANIANFUTURE
THEGREATALBANIA


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <map>
#include <iomanip>
#define INF 99999999
typedef long long LL;
using namespace std;

const int MAX=2*100000+10;
int *rank,r[MAX],sa[MAX],height[MAX];
int wa[MAX],wb[MAX],wm[MAX];
char s[MAX];

bool cmp(int *r,int a,int b,int l){
	return r[a] == r[b] && r[a+l] == r[b+l];
}

void makesa(int *r,int *sa,int n,int m){
	int *x=wa,*y=wb,*t;
	for(int i=0;i<m;++i)wm[i]=0;
	for(int i=0;i<n;++i)wm[x[i]=r[i]]++;
	for(int i=1;i<m;++i)wm[i]+=wm[i-1];
	for(int i=n-1;i>=0;--i)sa[--wm[x[i]]]=i;
	for(int i=0,j=1,p=0;p<n;j=j*2,m=p){
		for(p=0,i=n-j;i<n;++i)y[p++]=i;
		for(i=0;i<n;++i)if(sa[i]>=j)y[p++]=sa[i]-j;
		for(i=0;i<m;++i)wm[i]=0;
		for(i=0;i<n;++i)wm[x[y[i]]]++;
		for(i=1;i<m;++i)wm[i]+=wm[i-1];
		for(i=n-1;i>=0;--i)sa[--wm[x[y[i]]]]=y[i];
		for(t=x,x=y,y=t,i=p=1,x[sa[0]]=0;i<n;++i){
			x[sa[i]]=cmp(y,sa[i],sa[i-1],j)?p-1:p++;
		}
	}
	rank=x;
}

void calheight(int *r,int *sa,int n){
	for(int i=0,j=0,k=0;i<n;height[rank[i++]]=k){
		for(k?--k:0,j=sa[rank[i]-1];r[i+k] == r[j+k];++k);
	}
}

int main(){
	int n;
	while(cin>>n){
		cin>>s>>s+n+1;
		s[n]='#';
		int len=n;
		for(n=0;s[n] != '\0';++n)r[n]=s[n];
		r[n]=0;
		makesa(r,sa,n+1,256);
		calheight(r,sa,n);
		int sum=0,x=0,y=0;
		for(int i=1;i<=n;++i){
			if(height[i]>sum){
				if(sa[i]<len && sa[i-1]>len)sum=height[i],x=sa[i],y=x+sum;
				if(sa[i]>len && sa[i-1]<len)sum=height[i],x=sa[i-1],y=x+sum;
			}
		}
		for(int i=x;i<y;++i)cout<<s[i];
		cout<<endl;
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Ural1517 Freedom of choice, 后缀数组,最长公共子串

也是看后缀数组中的套题。。。 /*******************************************************************************...
  • neofung
  • neofung
  • 2012年06月05日 21:37
  • 504

ural1517

此题和前面题意差不多。也是paper上的 关键是要输出来。输出其实很简单,只要记录那个位置就好了。然后通过位置输出。但是中间需要加入一个特殊字符在整个长的串中。...
  • luyuncheng
  • luyuncheng
  • 2013年03月15日 14:14
  • 585

最长公共子串、最长公共子序列、最长回文子串、最长回文子序列、回文子串个数

1、最长公共子串 首先看最长公共子串的解答(暴力算法、动态规划、) 从优化到再优化,最长公共子串 2、最长公共子序列(LCS)  解析:动态规划解最长公共子序列问题 3、 leetcode ...
  • m0_37693059
  • m0_37693059
  • 2017年08月04日 16:39
  • 167

ural 1517

求两个串的公共最长前缀
  • ahjkl007
  • ahjkl007
  • 2014年06月18日 18:53
  • 337

lintcode 求最长公共子串

给出两个字符串,找到最长公共子串,并返回其长度。 这个其实比较简单,因为只要返回最长公共子串的长度就可以了,不用找出他们。PS:如果要是要求返回最长公共子串呢? 动态规划,最优子结构if s[i]...
  • u010510962
  • u010510962
  • 2016年03月21日 19:21
  • 294

动态规划之最长公共子串

一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有...
  • jianfpeng241241
  • jianfpeng241241
  • 2016年07月17日 00:06
  • 4141

文本相似度计算之--- 编辑距离 && 最长公共子串

问题引入:在自然语言处理ling
  • u012229612
  • u012229612
  • 2014年09月02日 14:19
  • 1115

求两个字符串的最长公共子串——Java实现

要求:求两个字符串的最长公共子串,如“abcdefg”和“adefgwgeweg”的最长公共子串为“defg”(子串必须是连续的) 方法一: 对于较短的那个字符串,假设其长度为n,依次找到它的长度...
  • xiaoyi357
  • xiaoyi357
  • 2017年04月17日 15:06
  • 4759

SPOJ1811最长公共子串问题(后缀自动机)

题目:http://www.spoj.com/problems/LCS/   题意:给两个串A和B,求这两个串的最长公共子串。   分析:其实本题用后缀数组的DC3已经能很好的解决,这里我们来...
  • ACdreamers
  • ACdreamers
  • 2013年08月31日 16:54
  • 2936

HDU 1238 Substrings (最长公共子串+DFS)

Substrings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016年06月03日 13:04
  • 518
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ural1517之最长公共子串
举报原因:
原因补充:

(最多只允许输入30个字)