博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解【poj2774 Long Long Message】
阅读量:5163 次
发布时间:2019-06-13

本文共 1854 字,大约阅读时间需要 6 分钟。

Description

求两个串的最长连续公共字串

Solution

后缀数组入门题吧

把两个串连在一起,中间加一个分隔符,然后跑一遍后缀数组,得到 height 和 sa

一个 height[i] 对答案有贡献的充要条件是 sa[i] 和 sa[i-1] 分别在两个串中

Code

#include 
#include
#include
#include
using namespace std;const int N = 200200;char s1[N], s2[N], S[N];int n, tmpn, cnt[N], ans, sa[N], rk[N], height[N]; struct node { int id, x, y; } a[N], b[N]; int main() { scanf("%s %s", s1, s2); tmpn = strlen(s1); for(int i = 0; s1[i]; i++) S[++n] = s1[i]; S[++n] = '#'; for(int i = 0; s2[i]; i++) S[++n] = s2[i]; for(int i = 1; i <= n; i++) cnt[S[i]] = 1; for(int i = 0; i <= 128; i++) cnt[i] += cnt[i - 1]; for(int i = 1; i <= n; i++) rk[i] = cnt[S[i]]; for(int L = 1; L <= n; L *= 2) { for(int i = 1; i <= n; i++) a[i].id = i, a[i].x = rk[i], a[i].y = rk[i + L]; for(int i = 1; i <= n; i++) cnt[i] = 0; for(int i = 1; i <= n; i++) cnt[a[i].y]++; for(int i = 1; i <= n; i++) cnt[i] += cnt[i - 1]; for(int i = 1; i <= n; i++) b[cnt[a[i].y]--] = a[i]; for(int i = 1; i <= n; i++) cnt[i] = 0; for(int i = 1; i <= n; i++) cnt[a[i].x]++; for(int i = 1; i <= n; i++) cnt[i] += cnt[i - 1]; for(int i = n; i >= 1; i--) a[cnt[b[i].x]--] = b[i]; for(int i = 1; i <= n; i++) if(a[i].x == a[i - 1].x && a[i].y == a[i - 1].y) rk[a[i].id] = rk[a[i - 1].id]; else rk[a[i].id] = rk[a[i - 1].id] + 1; } for(int i = 1; i <= n; i++) sa[rk[i]] = i; int k = 0; for(int i = 1; i <= n; i++) { int j = sa[rk[i] - 1]; if(k) k--; while(i + k <= n && j + k <= n && S[i + k] == S[j + k]) k++; height[rk[i]] = k; } for(int i = 1; i <= n; i++) if(sa[i] <= tmpn && sa[i - 1] > tmpn || sa[i] > tmpn && sa[i - 1] <= tmpn) ans = max(ans, height[i]); printf("%d\n", ans); return 0;}

转载于:https://www.cnblogs.com/acfunction/p/10066736.html

你可能感兴趣的文章
List_统计输入数值的各种值
查看>>
学习笔记-KMP算法
查看>>
Timer-triggered memory-to-memory DMA transfer demonstrator
查看>>
跨域问题整理
查看>>
[Linux]文件浏览
查看>>
64位主机64位oracle下装32位客户端ODAC(NFPACS版)
查看>>
获取国内随机IP的函数
查看>>
今天第一次写博客
查看>>
江城子·己亥年戊辰月丁丑日话凄凉
查看>>
IP V4 和 IP V6 初识
查看>>
Spring Mvc模式下Jquery Ajax 与后台交互操作
查看>>
(转)matlab练习程序(HOG方向梯度直方图)
查看>>
『Raid 平面最近点对』
查看>>
【ADO.NET基础-数据加密】第一篇(加密解密篇)
查看>>
C语言基础小结(一)
查看>>
STL中的优先级队列priority_queue
查看>>
UE4 使用UGM制作血条
查看>>
浏览器对属性兼容性支持力度查询网址
查看>>
OO学习总结与体会
查看>>
虚拟机长时间不关造成的问题
查看>>