题意:

给你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;
}

最新文章

  1. java-commons-HttpClient超时设置setConnectionTimeout和setSoTimeout
  2. 深入解析Javascript闭包
  3. UNION 查询中的排序
  4. [mock]7月25日
  5. sql 2005 同义词
  6. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(2)
  7. CN消息的来源——父窗口不知道怎么处理,于是把这个消息加上CN_BASE在分发到实际的子窗体
  8. linux处理闰秒
  9. PHP SimpleXML
  10. IOS之动画
  11. Azure 网站上的 Java
  12. 逆向思维 UVA 11853
  13. equals与==号的区别?
  14. 解决reverse改变原数组
  15. How to enable C development in a Windows 10 development environment VM
  16. ATPCS规则
  17. Docker Swarm 高可用详解
  18. Forth 内存布局
  19. oracle配置数据库可恢复性(认证系列总结一)
  20. C#实现http协议支持上传下载文件的GET、POST请求

热门文章

  1. Java的23种设计模式 &lt;二&gt;
  2. Linux命令行学习日志-ps ax
  3. codeforces#1157D. Ehab and the Expected XOR Problem(构造)
  4. C,线程池
  5. [CTS2019]珍珠——二项式反演
  6. BUUCTF平台-web-边刷边记录-1
  7. python pip 使用
  8. 自动化测试 | 好用的自动化测试工具Top 10
  9. springboot 获取控制器参数的几种方式
  10. 用Servlet返回JSON文本动态创建DataGrid