序列自动机—— [FJOI2016]所有公共子序列问题

序列自动机:

是一个处理子序列的自动机。就这样。

建造:(By猫老师:immoralCO猫)

s[]
next[][26]
memset(next[n], -1, 26<<2);
for(int i = n; i; --i) {memcpy(next[i - 1], next[i], 26 << 2);next[i - 1][s[i] - 'a'] = i;
}

nxt[][]数组就是第几个位置,序号为几的出边连接到第几个位置(位置是对应字符串的位置,其实并没用)

大概原理就是每当要循环到字符串中的一个位置,就把这个位置的连通性赋值给上一个节点编号,(可以理解,n个字符,其实是n条边,最多有n+1个节点在两边)

然后处理新来的字符i对于i-1号位置连通性的影响,那么,

编号从0~n,其中0号点就是根,dfs从0开始。

(不会的话,手动模拟就好了)

发现,当子序列中有重复元素的时候,nxt[i-1][s[i]-'a']=i一句可以将这种情况覆盖掉。

由于这些0~n号节点可以重复到达,当然最终到了n号点就是边界了。

所以dfs没有问题。而且大大节省了空间。

 

这样,我们可以只用有限的O(长度*|S|)的空间,来建造这棵树。

发现,这棵树好像trie啊~!!!!

其实差不多,一个子序列,一个子串。

 

操作也就和trie差不多了。

基本操作:

1.可以统计一个串本质不同的子序列的个数

序列自动机上可以是一棵树,树上每一个节点到根的路径上的边所代表的字符串就是所有的本质不同的子序列。

dfs树上扫一遍就好了。

 

2.可以查找一个子序列是否在这个字符串中出现过。

显然,dfs就可以。

 

3.也可以两个序列自动机一起dfs,找到所有公共子序列。

就比如说这个题:

(真是序列自动机板子题)

 

[FJOI2016]所有公共子序列问题

题目大意:给定两个字符串,求这两个串的所有公共子序列。

当输入的参量k=1的时候,按照字典序输出这些子序列,并输出个数。

当输入的参量k=0的时候,输出个数就可以。

注意,空字符串也是一个公共子序列。

分析:

裸裸裸裸的序列自动机。

开两个自动机,直接同时跑dfs就可以。

对于k=1,就要先走a,再走z,条件是两个都可以走,一遍用一个栈一样的字符串记录字符串。进入循环就输出即可。并且记录总数。

对于k=0,同理。

诶,怎么我的long long出了负数呢??

因为要高精。

诶,怎么我的高精MLE了呢????

因为要压位高精。

https://www.cnblogs.com/Miracevin/p/9031691.html

但是这个版本太弱了,很久以前写的。

所以,用结构体实现就比较方便了。结构体内置函数。

支持:高精加低精(因为要赋初值1(其实直接赋值也可以)),高精加高精,压位高精的输出。

没了。

看代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9;
const int N=3020;
const int L=58;
const int K=25;
int nxt1[N][L],nxt2[N][L];
char sta[N];
int top=-1;
ll ans;
int la,lb,k;
char a[N],b[N];
struct Big{//压位结构体 int cur;ll *s;void init(){s=new long long[20];for(int i=0;i<20;i++) s[i]=0;cur=0;}void put(){printf("%lld",s[cur]);for(int i=cur-1;i>=0;i--) printf("%09lld",s[i]);}void add(ll k){s[0]+=k;int i=0;while(s[i]>=mod) s[i+1]+=s[i]/mod,s[i++]%=mod;while(s[cur+1]) cur++;}void Add(const Big& o){ll i,r=max(cur,o.cur);for(int i=0;i<=r;i++){s[i]+=o.s[i];if(s[i]>=mod) s[i+1]+=s[i]/mod,s[i]%=mod;}cur=min(r+3,19ll);while(cur&&s[cur]==0) cur--;}
}dp[N][N];
bool vis[N][N];
void build1(){//建造序列自动机 memset(nxt1[la],-1,sizeof nxt1[la]);for(int i=la;i;i--){memcpy(nxt1[i-1],nxt1[i],sizeof nxt1[i]);nxt1[i-1][a[i]-'A']=i;}
}
void build2(){memset(nxt2[lb],-1,sizeof nxt2[lb]);for(int i=lb;i;i--){memcpy(nxt2[i-1],nxt2[i],sizeof nxt2[i]);nxt2[i-1][b[i]-'A']=i;}
}
void dfs2(int x,int y){//dfs if(vis[x][y]) return;vis[x][y]=1;dp[x][y].init();dp[x][y].add(1);for(int i=0;i<=57;i++){if(nxt1[x][i]!=-1&&nxt2[y][i]!=-1) {dfs2(nxt1[x][i],nxt2[y][i]);dp[x][y].Add(dp[nxt1[x][i]][nxt2[y][i]]);}}
}
ll dfs1(int x,int y){printf("%s\n",sta);ll cnt=1;for(int i=0;i<=57;i++){if(nxt1[x][i]!=-1&&nxt2[y][i]!=-1) {sta[++top]=i+'A';cnt+=dfs1(nxt1[x][i],nxt2[y][i]);sta[top--]=' ';}}return cnt;
}
int main()
{scanf("%d%d",&la,&lb);scanf("%s",a+1);scanf("%s",b+1);    scanf("%d",&k);build1();build2();if(k==1) {    dfs1(0,0);}dfs2(0,0);dp[0][0].put();return 0;
}

 

转载于:https://www.cnblogs.com/Miracevin/p/9169317.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1000种对Java的响应没有死

当一篇评论发表1000条评论时&#xff0c;值得考虑一下。 我上周的社论“ 如果Java即将死&#xff0c;它肯定看起来非常健康 ”在各个开发人员社区中都感到不安 。 在Reddit&#xff0c;Hacker News和Slashdot之间&#xff0c;它收到了1000多个评论。 奇怪的是&#xff0c;很少…

java导包

下载响应的zip文件&#xff0c;就可以导入了&#xff0c;导入src目录也是可以的。 转载于:https://www.cnblogs.com/liaoxiaolao/p/9902062.html

分享轮子-flutter下拉刷新上拉加载

flutter下拉上拉组件轮子 什么是flutter? 首先说下flutter,估计这个应该挺多人没听过flutter这个框架,它是一个google推出的跨平台的移动应用UI框架,和React Native是同样的目的,支持三大平台:Android,Ios,还有一个是google新出的系统,忘了叫什么...本人React Native也是用过…

linux块设备驱动中断程序,linux设备驱动归纳总结(六):1.中断的实现

linux设备驱动归纳总结(六)&#xff1a;1.中断的实现xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx一、什么是中断中断分两种&#xff1a;1)中断&#xff0c;又叫外部中断或异步中断&#xff0c;它的产生是由于外设向处理器发出中断…

(8)Python判断结构

转载于:https://www.cnblogs.com/hankleo/p/9170325.html

Java:本地最小语言

在1996年至2002年之间&#xff0c;我用Java编写了成千上万行代码。我用Java 1.0到Java 1.4编写了Web框架&#xff0c;电子表格以及更多内容。 与90年代中期&#xff08;预模板&#xff09;的C 相比&#xff0c;Java是一种完全令人惊奇的语言。 JVM是所有计算机语言的最佳运行时…

History of program(1950-2020)

1957年 约翰巴科斯&#xff08;John Backus&#xff09;创建了是全世界第一套高阶语言&#xff1a;FORTRAN。 John Backus1959年 葛丽丝霍普&#xff08;Grace Hopper&#xff09;创造了现代第一个编译器A-0 系统&#xff0c;以及商用电脑编程语言“COBOL”&#xff0c;被誉为C…

关于 Nuxt 集成ueditor的一些坑(包括图片上传)前端部分

最近公司接了一个项目&#xff0c;里面用到富文本编辑器&#xff0c;刚开始用的是vue-quill-editor&#xff0c;这个编辑器轻量、好用。最重要的是它有专门正对nuxt的版本&#xff0c;很容易配置&#xff0c;可以放心使用&#xff0c;不用担心bug之类的&#xff0c;遇到问题&am…

linux 线程带参数,Linux中多线程编程并传递多个参数的简单例子

今天上午实验了Linux下的多线程编程&#xff0c;并将多个参数传递给线程要执行的函数。以下是实验程序的源代码&#xff1a;/*********************** pthread.c ***************************/#include #include #include #include #include struct argument{int num;char stri…

*Codeforces989D. A Shade of Moonlight

数轴上$n \leq 100000$个不重叠的云&#xff0c;给坐标&#xff0c;长度都是$l$&#xff0c;有些云速度1&#xff0c;有些云速度-1&#xff0c;风速记为$w$&#xff0c;问在风速不大于$w_{max}$时&#xff0c;有几对云可能在0相遇。每一对云单独考虑。 多动一不动--相对运动。假…

undefined reference 问题各种情况分析

扒自网友文章 关于undefined reference这样的问题&#xff0c;大家其实经常会遇到&#xff0c;在此&#xff0c;我以详细地示例给出常见错误的各种原因以及解决方法&#xff0c;希望对初学者有所帮助。 1. 链接时缺失了相关目标文件&#xff08;.o&#xff09; 测试代码如下&a…

Spring交易可见性

在初始化应用程序上下文时&#xff0c;Spring遇到带有Transactional标记的类时会创建代理。 Transactional可以应用于类级别或方法级别。 在类级别应用它意味着该类中定义的所有公共方法都是事务性的。 Spring创建的代理类型&#xff0c;即Jdk代理或CGLIB代理&#xff0c;取决于…

Axios 作弊表(Cheat Sheet)

英文原文链接 GET 请求 // Make a request for a user with a given ID axios.get(/user?ID12345).then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});// Optionally the request above could also be done as axios.get(…

loadrunner post请求

注意&#xff1a;loadrunner参数中的引号&#xff0c;需要自己加"\" post 请求&#xff0c;分为header 和body两个部分处理 header部分比较容易处理&#xff0c;使用函数实现&#xff0c;如web_add_header("pid","1")即可&#xff0c;具体参数可…

2018-2019-1 20165203 《信息安全系统设计基础》第六周学习总结

2018-2019-1 20165203 《信息安全系统设计基础》第六周学习总结 教材学习内容总结 重要知识点 I/O&#xff1a;在主存和外部设备&#xff08;例如磁盘存储器、终端和网络&#xff09;之间复制数据的过程。输入操作&#xff1a;从I/O设备复制数据到主存。输出操作&#xff1a;从…

linux 使用VI命令怎么删除输入内容,linux系统vi编辑器常用命令及使用方法。

在linux系统中编辑文档我们常用到vi编辑器。vi编辑器&#xff0c;通常称之为vi,是一种广泛存在于各种UNIX和Linux系统中的文本编辑程序。它的功能十分强大&#xff0c;但是命令繁多&#xff0c;不容易掌握&#xff0c;它可以执行输出、删除、查找、替换、块操作等众多文本操作&…

Spring安全–幕后

安全任务&#xff08;例如&#xff0c;用户身份验证和用户查看应用程序资源的授权&#xff09;通常由应用程序服务器处理。 可以将这些任务委托给Spring安全性流程&#xff0c;以减轻应用程序服务器处理这些任务的负担。 Spring安全性基本上通过实现标准javax.servlet.Filter来…

在react中使用svg的各种骚姿势

开头先抛个可供参考的项目ts-react-webpack4, 或脚手架steamer-react-ts 优势 SVG可被非常多的工具读取和修改(比如vscode)不失真, 放大缩小图像都很清晰SVG文件是纯粹的XML, 也是一种DOM结构使用方便, 设计软件可以直接导出 兼容性 上一张兼容性图表, 或到caniuse.com查看 …

chrome 浏览器的插件权限有多大?

转自&#xff1a;https://segmentfault.com/q/1010000003777353 1&#xff09;Chrome插件本身有机制控制&#xff0c;不会无限制的开放很多权限给你2&#xff09;页面的DOM元素时可以操作的&#xff0c;Chrome插件是和宿主页面之间是共享DOM对象&#xff0c;但是不共享Javascri…

3.2自定义方法

方法是类的一种行为&#xff0c;方会使我们的代码容易修改&#xff0c;方便阅读&#xff0c;实现封装和重用。比如前面使用的很多.net定义好的类的方法&#xff0c;当然我们也可以自定义方法。 3.2.1定义方法 语法&#xff1a; 访问修饰符 返回类型 方法名(参数列表) &#xff…