当前位置: 首页 > news >正文

[BZOJ4566][HAOI2016]找相同字符(SAM)

4566: [Haoi2016]找相同字符

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 950  Solved: 550
[Submit][Status][Discuss]

Description

给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。两个方案不同当且仅当这两
个子串中有一个位置不同。

Input

两行,两个字符串s1,s2,长度分别为n1,n2。1 <=n1, n2<= 200000,字符串中只有小写字母

Output

输出一个整数表示答案

Sample Input

aabb
bbaa

Sample Output

10

HINT

Source

[ Submit][ Status][ Discuss]

后缀数组+单调栈可以做,但是后缀数组的超长模板加上单调栈的超多细节,想想就复杂。

对于热爱DP或码力不够的选手,SAM则是最佳选择。

给两个式子自己体会什么意思,很好理解。(tmp表示当前匹配上的长度)

sum[i]=sum[fa[i]]+(l[i]-l[fa[i]])*right[i],ans+=sum[fa[p]]+(tmp-l[fa[p]])*right[p]

radixsort然后拓扑DP即可,模板又打错了。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define rep(i,l,r) for (int i=l; i<=r; i++)
 5 typedef long long ll;
 6 using namespace std;
 7 
 8 const int N=400100;
 9 char s1[N],s2[N];
10 int n,m,p,lst=1,np,cnt=1,mx[N],right[N],fa[N],son[N][26],q[N],c[N];
11 ll ans,sum[N];
12 
13 void ext(int c){
14     p=lst; lst=np=++cnt; mx[np]=mx[p]+1; right[np]++;
15     while (!son[p][c] && p) son[p][c]=np,p=fa[p];
16     if (!p) fa[np]=1;
17     else{
18         int q=son[p][c];
19         if (mx[q]==mx[p]+1) fa[np]=q;
20         else{
21             int nq=++cnt; mx[nq]=mx[p]+1;
22             memcpy(son[nq],son[q],sizeof(son[q]));
23             while (p && son[p][c]==q) son[p][c]=nq,p=fa[p];
24             fa[nq]=fa[q]; fa[q]=fa[np]=nq;
25         }
26     }
27 }
28 
29 void radix(){
30     rep(i,0,n) c[i]=0;
31     rep(i,1,cnt) c[mx[i]]++;
32     rep(i,1,n) c[i]+=c[i-1];
33     for (int i=cnt; i; i--) q[c[mx[i]]--]=i;
34     for (int i=cnt; i; i--) right[fa[q[i]]]+=right[q[i]];
35     rep(i,1,cnt) sum[q[i]]=sum[fa[q[i]]]+(mx[q[i]]-mx[fa[q[i]]])*right[q[i]];
36 }
37 
38 void solve(){
39     int tmp=0; p=1;
40     rep(i,1,m){
41         int c=s2[i]-'a';
42         if (son[p][c]) p=son[p][c],tmp++;
43         else{
44             while (p && !son[p][c]) p=fa[p];
45             if (!p) p=1,tmp=0; else tmp=mx[p]+1,p=son[p][c];
46         }
47         ans+=sum[fa[p]]+1ll*(tmp-mx[fa[p]])*right[p];
48     }
49 }
50 
51 int main(){
52     freopen("bzoj4566.in","r",stdin);
53     freopen("bzoj4566.out","w",stdout);
54     scanf("%s",s1+1); n=strlen(s1+1);
55     scanf("%s",s2+1); m=strlen(s2+1);
56     rep(i,1,n) ext(s1[i]-'a');
57     radix(); solve(); printf("%lld\n",ans);
58     return 0;
59 }

 

转载于:https://www.cnblogs.com/HocRiser/p/8856770.html

相关文章:

  • 共享单车数据分析
  • 微信聊天记录数据分析
  • django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.的解决办法
  • 电脑维护与故障排除_SY215C 挖掘机结构原理、日常维护保养和常见故障诊断排除...
  • C#/.NET基础视频[2018年][195集完]
  • 安卓手机主题软件_【软件】安卓手机延时摄影视频软件APP
  • 怎么让列表的文字只显示两行,多出的出现省略号?
  • linux 查询文件大小大于1g_2020非常全的软件测试linux面试题及参考答案
  • 逻辑运算符、三元运算符、for循环、stack(栈),heap(堆),方法区,静态域
  • python 字符转义_从零开始学习python(2)——字符串基础
  • 初识安全测试
  • tensorflow 迁移学习_中文学习资源:斯坦福大学CS231n计算机视觉课程
  • css3动画效果
  • excel打不开怎么修复_遇到MP4视频打不开应该怎么做
  • py遍历字符串的每个字符_Python超详细的字符串用法大全
  • canvas绘制圆角头像
  • Java|序列化异常StreamCorruptedException的解决方法
  • Javascript基础之Array数组API
  • Java的Interrupt与线程中断
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Redis学习笔记 - pipline(流水线、管道)
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 观察者模式实现非直接耦合
  • 如何利用MongoDB打造TOP榜小程序
  • 收藏好这篇,别再只说“数据劫持”了
  • 数组的操作
  • 新书推荐|Windows黑客编程技术详解
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • (11)MATLAB PCA+SVM 人脸识别
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .describe() python_Python-Win32com-Excel
  • .dwp和.webpart的区别
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET大文件上传知识整理
  • @Documented注解的作用
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [].slice.call()将类数组转化为真正的数组
  • []error LNK2001: unresolved external symbol _m
  • [20150629]简单的加密连接.txt
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [BIZ] - 1.金融交易系统特点
  • [C++]C++入门--引用
  • [CLickhouse] 学习小计
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件
  • [Foreman]解决Unable to find internal system admin account
  • [HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页
  • [Java开发之路](14)反射机制
  • [LeetCode] Merge Two Sorted Lists