题意

      给定字符串A、B,求其最长公共子串

  后缀数组模板题,求出height数组,判断sa[i]与sa[i-1]是否分属字符串A、B,统计答案即可。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream> using namespace std; const int maxn = ;
char str[maxn];
int num[maxn];
int wa[maxn], wb[maxn], wv[maxn], sum[maxn];
int rank[maxn], sa[maxn], height[maxn]; bool cmp(int *r, int a, int b, int l)
{
return (r[a] == r[b]) && (r[a+l] == r[b+l]);
} void da(int *r, int *sa, int n, int m)
{
int *x = wa, *y = wb, *t;
for (int i = ; i <= m; ++i)
sum[i] = ;
for (int i = ; i <= n; ++i)
sum[x[i]=r[i]] ++;
for (int i = ; i <= m; ++i)
sum[i] += sum[i-];
for (int i = n; i >= ; --i)
sa[sum[x[i]]--] = i;
for (int i, 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)
sum[i] = ;
for (i = ; i <= n; ++i)
sum[wv[i]] ++;
for (i = ; i <= m; ++i)
sum[i] += sum[i-];
for (i = n; i >= ; --i)
sa[sum[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;
}/*
for (int i = 1; i <= n; ++i)
printf("%d ", sa[i]);
printf("\n");*/
} void calheight(int *r, int *sa, int n)
{
for (int i = ; i <= n; ++i)
rank[sa[i]] = i;/*
for (int i = 1; i <= n; ++i)
printf("%d ", rank[i]);
printf("\n");*/
int k = ;
for (int i = ; i <= n; ++i)
{
if (k > )
k --;
int j = sa[rank[i]-];
while (r[i+k] == r[j+k] && i+k <= n && j+k <= n)
k ++;
height[rank[i]] = k;
}
} int main()
{
scanf("%s", str);
int l1 = strlen(str);
for (int i = ; i <= l1; ++i)
num[i] = str[i-]-'a'+;
num[l1+] = ;
scanf("%s", str);
int l2 = strlen(str);
for (int i = ; i <= l2; ++i)
num[l1++i] = str[i-]-'a'+;
da(num, sa, l1+l2+, );
calheight(num, sa, l1+l2+);
int ans = ;
for (int i = ; i <= l1+l2+; ++i)
if ((sa[i] <= l1 && sa[i-] >= l1+)
|| (sa[i-] <= l1 && sa[i] >= l1+))
ans = max(ans, height[i]);
printf("%d\n", ans);
return ;
}

最新文章

  1. Struts2第一个入门案例
  2. Delete,Update与LEFT Join
  3. crawler: 爬虫的基本结构
  4. 数据结构--树状数组&amp;&amp;线段树--基本操作
  5. Go语言开发环境搭建
  6. CentOS安装vsftpd
  7. sql查询结果集根据指定条件排序的方法
  8. GPUImage 自定义滤镜
  9. 关于padding
  10. &quot;手机信号放大器&quot; 让手机信号增强的办法
  11. 浏览器的云加速可能导致IP统计异常
  12. Linux学习之sudo命令
  13. js中valueOf方法的使用
  14. 正则表达式判断QQ号格式是否正确
  15. ionic3使用@angular/http 访问nodejs(koa2框架)服务不能返回数据
  16. Asp.Net MVC页面显示后台处理进度问题
  17. 【做题】arc072_f-Dam——维护下凸包
  18. 第 6 章 存储 - 039 - Data Volume 之 bind mount
  19. 百练-16年9月推免-B题-字符串判等
  20. 关于float样式

热门文章

  1. 原 jQuery中document的ready和load事件的区别?
  2. Friends and Berries URAL - 2067 (计算三点共线和计算的时候的注意点)
  3. 好消息! 不用再羡慕Python有jupyter 我R也有Notebook了【附演示视频】
  4. MongoDB之主从复制和副本集(四)
  5. 浅析linux内核中timer定时器的生成和sofirq软中断调用流程(转自http://blog.chinaunix.net/uid-20564848-id-73480.html)
  6. MessageDigest类实现md5加密
  7. 使用extjs做的一个简单grid
  8. JavaWeb知识回顾-servlet简介。
  9. WordPress SMTP发送邮件插件:WP SMTP
  10. appium---【Mac】Appium-Doctor提示WARN:“ ios_webkit_debug_proxy cannot be found”解决方案