URAL 1517 Freedom of Choice(后缀数组,最长公共字串)
输出最长公共字串
#define maxn 200010
int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}//yuan lai zhi qian ba zhe li de l cuo dang cheng 1 le ...
void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=;i<m;i++)ws[i]=;
for(i=;i<n;i++)ws[x[i]=r[i]]++;
for(i=;i<m;i++)ws[i]+=ws[i-];
for(i=n-;i>=;i--)sa[--ws[x[i]]]=i;
for(j=,p=;p<n;j*=,m=p)
{
for(p=,i=n-j;i<n;i++)y[p++]=i;
for(i=;i<n;i++)if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=;i<n;i++)wv[i]=x[y[i]];
for(i=;i<m;i++)ws[i]=;
for(i=;i<n;i++)ws[wv[i]]++;
for(i=;i<m;i++)ws[i]+=ws[i-];
for(i=n-;i>=;i--)sa[--ws[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=,x[sa[]]=,i=;i<n;i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],j)? (p-):p++;
}
}
int rankk[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{
int i,j,k=;
for(i=;i<=n;i++)rankk[sa[i]]=i;
for(i=;i<n;height[rankk[i++]]=k)
for(k? k--:,j=sa[rankk[i]-];r[i+k]==r[j+k];k++);
}
int RMQ[maxn];
int mm[maxn];
int best[][maxn];
void initRMQ(int n)
{
int i,j,a,b;
for(mm[]=-,i=;i<=n;i++)
mm[i]=((i&(i-))==) ? mm[i-]+:mm[i-];
for(i=;i<=n;i++)best[][i]=i;
for(i=;i<=mm[n];i++)
for(j=;j<=n+-(<<i);j++)
{
a=best[i-][j];
b=best[i-][j+(<<(i-))];
if(RMQ[a]<RMQ[b])best[i][j]=a;
else best[i][j]=b;
}
}
int askRMQ(int a,int b)
{
int t;
t=mm[b-a+];b-=(<<t)-;
a=best[t][a];b=best[t][b];
return RMQ[a]<RMQ[b]? a:b;
}
int lcp(int a,int b)
{
int t;
a=rankk[a]; b=rankk[b];
if(a>b) {t=a;a=b;b=t;}
return (height[askRMQ(a+,b)]);
} char s[maxn];
int r[maxn],sa[maxn];
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
scanf("%s",s);
int len1=strlen(s);
s[len1]='';//yin wei bu ce ng chu xian ,suo yi bu yong dan xin ying xiang jie guo
scanf("%s",s+len1+);
int len2=strlen(s); for(int i=;i<len2;i++)r[i]=s[i];//r[i]biao shi pai de shi di ji
r[len2]=;//ji shu pai xu shi de xu yao ,zui hou yi ge jia she wei zui xiao da(r,sa,len2+,);
calheight(r,sa,len2);
int ans=,be=-;
//bian li height shu zu, cong di 2 ge kai shi (xia biao shi cong 1 kai shi de )
for(int i=;i<=len2;i++)
{
if(height[i]>ans)
{
if((len1<sa[i]&&len1>sa[i-])||(len1>sa[i]&&len1<sa[i-]))
{
ans=height[i];be=sa[i];
}
}
}
if(be!=-)
for(int i=be;i<be+ans;i++)printf("%c",s[i]);
printf("\n");
}
return ;
}
URAL 1517 Freedom of Choice(后缀数组,最长公共字串)的更多相关文章
- Ural 1517. Freedom of Choice 后缀数组
Ural1517 所谓后缀数组, 实际上准确的说,应该是排序后缀数组. 一个长度为N的字符串,显然有N个后缀,将他们放入一个数组中并按字典序排序就是后缀数组的任务. 这个数组有很好的性质,使得我们运行 ...
- URAL 1517 Freedom of Choice (后缀数组 输出两个串最长公共子串)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/whyorwhnt/article/details/34075603 题意:给出两个串的长度(一样长) ...
- POJ 2774 (后缀数组 最长公共字串) Long Long Message
用一个特殊字符将两个字符串连接起来,然后找最大的height,而且要求这两个相邻的后缀的第一个字符不能在同一个字符串中. #include <cstdio> #include <cs ...
- POJ-2774-Long Long Message(后缀数组-最长公共子串)
题意: 给定两个字符串 A 和 B,求最长公共子串. 分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀. 求 A 和 B 的最长公共子串等价于求 A 的后缀和 B 的后缀的最长公共前缀的最大 ...
- URAL 1517 Freedom of Choice
Freedom of Choice Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on Ural. Orig ...
- POJ 2217 (后缀数组+最长公共子串)
题目链接: http://poj.org/problem?id=2217 题目大意: 求两个串的最长公共子串,注意子串是连续的,而子序列可以不连续. 解题思路: 后缀数组解法是这类问题的模板解法. 对 ...
- CSU1632Repeated Substrings(后缀数组/最长公共前缀)
题意就是求一个字符串的重复出现(出现次数>=2)的不同子串的个数. 标准解法是后缀数组.最长公共前缀的应用,对于样例aabaab,先将所有后缀排序: aab 3 aabaab 1 a ...
- [poj 2274]后缀数组+最长公共子串
题目链接:http://poj.org/problem?id=2774 后缀数组真的太强大了,原本dp是O(nm)的复杂度,在这里只需要O(n+m). 做法:将两个串中间夹一个未出现过的字符接起来,然 ...
- POJ3450 Corporate Identity —— 后缀数组 最长公共子序列
题目链接:https://vjudge.net/problem/POJ-3450 Corporate Identity Time Limit: 3000MS Memory Limit: 65536 ...
随机推荐
- 应用程序域(Application Domain)
应用程序域为隔离正在运行的应用程序提供了一种灵活而安全的方法. 应用程序域通常由运行时宿主创建和操作. 有时,您可能希望应用程序以编程方式与应用程序域交互,例如想在不停止应用程序运行的情况下卸载某个组 ...
- .net 高效管理稀缺资源(数据库资源,文件资源等)
MSDN建议按照下面的模式实现IDisposable接口: public class Foo: IDisposable { public void Dispose() { Dispose(true); ...
- 关于在android4.1.x的版本不能启动支付宝问题
异常:Failure calling remote service 异常日志: INFO/<unknown>(<unknown>): java.security.spec.In ...
- Qt 读取txt文件乱码的解决办法
Qt 读取txt文本乱码问题 2015-05-20 15:46 方法一:使用QString的fromLocal8Bit()函数 复制代码 QFile txtfile(filePath); ...
- mysql安装/启动报错汇总
2016/9/6补充 初始化报错: # /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysq ...
- java7新特新(一) Try-with-resources (TWR)
Try-with-resources (TWR) 在处理IO的代码中,我们会使用大量的try...catch()...finally...语法,其中会在finally进行IO的close操作,写过py ...
- JS获取字符串长度(英文占1个字符,中文汉字占2个字符)
方法一: String.prototype.gblen = function() { var len = 0; for (var i = 0; i < this.length; i++) { i ...
- WEB实时聊天 comet推技术
转自:http://www.cnblogs.com/wodemeng/archive/2012/04/06/2435302.html 今天晚上朋友遇到web服务端推技术的问题,自己就查了下资料,学习了 ...
- 关于Python中的yield
关于Python中的yield 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...
- 【工具】openwrt安装记录
步骤: 1 从以太网引导启动.由于我们实验室在服务器上放了一个openwrt镜像,安装时先从以太网启动,将服务器上的镜像载入到RAM中启动系统. 2 用SCP将在PC上编译好的openwrt-XX ...