题意:

给你S串和T串,用T串的所有前缀去匹配S串(匹配值是最长公共子串)。

问你总值相加是多少。

思路:

先把两个S,T串倒过来,再拼接 S#T 合成一串,跑一下后缀数组

在排序好的rank里计算每个T后缀的最长匹配长度。(前后两个for即可)

最后dp对后缀取max,累计答案。(因为后缀从pos开始的ans1肯定被后缀从pos-1开始的ans2包含,所以如果ans2<ans1,那要对ans2取max(ans1)

 #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#include <cstdio>//sprintf islower isupper
#include <cstdlib>//malloc exit strcat itoa system("cls")
#include <iostream>//pair
#include <fstream>//freopen("C:\\Users\\13606\\Desktop\\草稿.txt","r",stdin);
#include <bitset>
//#include <map>
//#include<unordered_map> https://www.nitacm.com/problem_show.php?pid=585
#include <vector>
#include <stack>
#include <set>
#include <string.h>//strstr substr
#include <string>
#include <time.h>//srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
#include <cmath>
#include <deque>
#include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
#include <vector>//emplace_back
//#include <math.h>
//#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
#include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
#define fo(a,b,c) for(register int a=b;a<=c;++a)
#define fr(a,b,c) for(register int a=b;a>=c;--a)
#define mem(a,b) memset(a,b,sizeof(a))
#define pr printf
#define sc scanf
#define ls rt<<1
#define rs rt<<1|1
typedef long long ll;
#define rint register int
void swapp(int &a,int &b);
double fabss(double a);
int maxx(int a,int b);
int minn(int a,int b);
int Del_bit_1(int n);
int lowbit(int n);
int abss(int a);
//const long long INF=(1LL<<60);
const double E=2.718281828;
const double PI=acos(-1.0);
const int inf=(<<);
const double ESP=1e-;
const int mod=(int)1e9+;
const int N=(int)2e6+;
void PR(int _[],int n)
{
for(int i=;i<=n;++i)
pr("%d ",_[i]);
pr("\n");
}
char s[N],s1[N],s2[N];
int a[N];
int sa[N],rk[N],s_a[N],t[N];//桶的大小要为N,因为放的是rank;
int height[N],h[N];//h是位置i的长度,heidgt是ranki的长度;
void Init(int _[],int n)
{
for(rint i=;i<=n;++i)
_[i]=;
}
bool cmp(int i,int j,int k)
{
return s_a[i]==s_a[j]&&s_a[i+k]==s_a[j+k];
}
void Sort(int len)
{
int m=;//字符集大小;
for(rint i=;i<=len;++i) ++t[a[i]],rk[i]=a[i];
for(rint i=;i<=m;++i) t[i]+=t[i-];
for(rint i=len;i>=;--i) sa[t[rk[i]]--]=i;
for(rint k=;k<=len;k<<=)
{
int cnt=;
//按第二个rank排;
for(rint i=len-k+;i<=len;++i) s_a[++cnt]=i;
for(rint i=;i<=len;++i)if(sa[i]>k) s_a[++cnt]=sa[i]-k;
//按第一个rank排;
Init(t,m);
for(rint i=;i<=len;++i) ++t[rk[s_a[i]]];
for(rint i=;i<=m;++i) t[i]+=t[i-];
for(rint i=len;i>=;--i) sa[t[rk[s_a[i]]]--]=s_a[i]; swap(rk,s_a);rk[sa[]]=cnt=;
for(rint i=;i<=len;++i)
rk[sa[i]]=cmp(sa[i],sa[i-],k)?cnt:++cnt;
if(cnt==len)break;
m=cnt;
}
//求height数组;
for(rint i=;i<=len;++i)
{
h[i]=max(,h[i-]-);
if(rk[i]==)continue;
while(a[i+h[i]]==a[sa[rk[i]-]+h[i]]) ++h[i];
}
for(rint i=;i<=len;++i) height[i]=h[sa[i]];
} int ans[N],res[N]; int main()
{
// freopen("D:\\Chrome Download\\testdata (2).in","r",stdin);
int len1,len2;
sc("%d%d",&len1,&len2);
sc("%s%s",s1+,s2+);
int len=;
for(int i=len1;i>=;--i)
a[++len]=s1[i]-'a'+;
a[++len]=;
for(int i=len2;i>=;--i)
a[++len]=s2[i]-'a'+;
Sort(len);
// PR(height,len);
// PR(sa,len);
// PR(rk,len);
int temp=;
for(int i=;i<=len;++i)
{
// temp=min(temp,height[i+1]);
if(sa[i]<=len1)
temp=height[i+];
else
ans[i]=temp,temp=min(temp,height[i+]);
}
temp=;
for(int i=len;i>=;--i)
{
// temp=min(temp,height[i+1]);
if(sa[i]<=len1)
temp=height[i];
else
ans[i]=max(ans[i],temp),temp=min(temp,height[i]);
}
// PR(ans,len);
ll Ans=;
for(int i=len;i>=len1+;--i)
{
res[i]=max(res[i+],ans[rk[i]]);
Ans+=res[i];
}
pr("%lld\n",Ans);
return ;
} /**************************************************************************************/ int maxx(int a,int b)
{
return a>b?a:b;
} void swapp(int &a,int &b)
{
a^=b^=a^=b;
} int lowbit(int n)
{
return n&(-n);
} int Del_bit_1(int n)
{
return n&(n-);
} int abss(int a)
{
return a>?a:-a;
} double fabss(double a)
{
return a>?a:-a;
} int minn(int a,int b)
{
return a<b?a:b;
}

后缀数组 LCP--模板题的更多相关文章

  1. PKU 2774 Long Long Message (后缀数组练习模板题)

    题意:给你两个字符串.求最长公共字串的长度. by:罗穗骞模板 #include <iostream> #include <stdio.h> #include <stri ...

  2. poj 2774 Long Long Message 后缀数组LCP理解

    题目链接 题意:给两个长度不超过1e5的字符串,问两个字符串的连续公共子串最大长度为多少? 思路:两个字符串连接之后直接后缀数组+LCP,在height中找出max同时满足一左一右即可: #inclu ...

  3. 后缀数组Da模板+注释 以及 dc3模板

    后缀数组Da模板: 1 /* 2 后缀数组倍增法Da板子 3 */ 4 #include <cstdlib> 5 #include <cstring> 6 #include & ...

  4. hdu 4691 最长的共同前缀 后缀数组 +lcp+rmq

    http://acm.hdu.edu.cn/showproblem.php? pid=4691 去年夏天,更多的学校的种族称号.当时,没有后缀数组 今天将是,事实上,自己的后缀阵列组合rmq或到,但是 ...

  5. UOJ35 后缀数组(模板)

    #35. 后缀排序 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 1 ...

  6. hdu 3518 Boring counting 后缀数组LCP

    题目链接 题意:给定长度为n(n <= 1000)的只含小写字母的字符串,问字符串子串不重叠出现最少两次的不同子串个数; input: aaaa ababcabb aaaaaa # output ...

  7. 后缀数组LCP + 二分 - UVa 11107 Life Forms

    Life Forms Problem's Link Mean: 给你n个串,让你找出出现次数大于n/2的最长公共子串.如果有多个,按字典序排列输出. analyse: 经典题. 直接二分判断答案. 判 ...

  8. 后缀数组 + LCP加速多模式匹配算法 O(m+logn)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  9. UVA 11107 Life Forms——(多字符串的最长公共子序列,后缀数组+LCP)

    题意: 输入n个序列,求出一个最大长度的字符串,使得它在超过一半的DNA序列中连续出现.如果有多解,按照字典序从小到大输出所有解. 分析:这道题的关键是将多个字符串连接成一个串,方法是用不同的分隔符把 ...

随机推荐

  1. 【Redis 设置Redis使用LRU算法】

    转自:http://ifeve.com/redis-lru/ 本文将介绍Redis在生产环境中使用的Redis的LRU策略,以及自己动手实现的LRU算法(php) 1.设置Redis使用LRU算法 L ...

  2. linux下查看tomcat的日志

    工作期间有碰到服务器日志相关的,需要看tomcat运行日志,简单搜了下,摘为随笔,以供参考 一种是利用docker查看 1.使用dockerdocker logs -f -t --since=&quo ...

  3. TIZ_c 第0周总结(2019/10/15-2019/10/22)工欲善其事必先利其器

    TIZ_c 第0周总结(2019/10/15-2019/10/22)工欲善其事必先利其器 任务清单 给自己取一个酷酷的id,并选择1-2个喜欢的方向.(只是初步选择,后期可更改) 改下群名片.例如yo ...

  4. Ubuntu安装Redis及使用

    NoSQL简介NoSQL,全名为Not Only SQL,指的是非关系型的数据库随着访问量的上升,网站的数据库性能出现了问题,于是nosql被设计出来 优点/缺点优点:高可扩展性分布式计算低成本架构的 ...

  5. Postgresql 直接在查询结果中生成唯一ID

    不需要排序 select (row_number() over()) as id from generate_series(1,100)1根据指定的字段排序 select (row_number() ...

  6. PHP AJAX 返回XML数据

    例子:利用AJAX间接访问数据库,查出Nation表中的数据,返回XML数据,并将Nation表中的数据显示在下拉列表框中 外层建一个下拉列表框 </select> JQurey代码 $( ...

  7. 【学习笔记】QT常用类及应用

    一.QT基类: QObject 二.QT中常用的库 QT中的类根据功能划分在不同的库中,在用户属性.pro文件中可以看到. 三.Qt基本对话框的使用 常用5类: 通过类名可以直接调用类的静态成员函数. ...

  8. [go]包管理

    vendor方式 //包管理发展 go get(无版本概念) -> vendor(godep)(无版本概念) -> go modules go get github.com/tools/g ...

  9. selenium 学习中遇到的问题汇总

    1.使用document.getByClassName时无click事件,然后就不知道怎么办了,也不太懂前端,与开发大哥确认,div 中class实现展开和收起是通过隐藏和显示这种方式实现的,在编写时 ...

  10. 07 MySQL之视图

    01-视图的含义 视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表.视图还可以从已经存在的视图的基础上定义. 02-创建视图 # 基本语法格式: CREATE [OR REP ...