【LOJ】#2172. 「FJOI2016」所有公共子序列问题
题解
听说是什么序列自动机?
我们考虑对于每个位置的串,下面拼接相同的字符时,拼接最近的一个,这样可以保证不重不漏
为了实现这个我们需要什么呢,我们需要一个链表,记录一下每个位置的下一个字符会转移到哪里
例如
ABAB
ch[1]['A'] = 3 ch[1]['B'] = 2
听起来挺好建的,具体可以看代码
然后我们记录dp[a][b]是第一个字符串a位置的字符为开头,第二个字符串b位置的字符为开头,公共子序列的个数
可以记忆化搜索,每一次枚举下一个位置拼接上哪个字符
输出方案的话也是一样,枚举下一个位置拼上哪个字符
后五个点需要高精度啊= =
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <map>
//#define ivorysi
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define mo 974711
#define MAXN 3055
#define RG register
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {putchar('-');x = -x;}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,M,MK,ci[205];
char x[MAXN],y[MAXN],ic[205],s[MAXN];
struct segAM {
int head[62],next[MAXN],ch[MAXN][62],tot;
segAM() {
tot = 1;next[1] = 0;
for(int i = 0 ; i <= 60; ++i) head[i] = 1;
}
void Insert(char c) {
++tot;
next[tot] = head[ci[c]];
for(int i = 0 ; i <= 51 ; ++i) {
for(int j = head[i] ; j && !ch[j][ci[c]] ; j = next[j]) {
ch[j][ci[c]] = tot;
}
}
head[ci[c]] = tot;
}
}S1,S2;
const int BASE = 100000000;
const int LEN = 8;
struct Bignum {
vector<int> v;
Bignum operator = (int64 x) {
v.clear();
do {
v.pb(x % BASE);
x /= BASE;
}while(x);
return *this;
}
friend Bignum operator + (const Bignum &a,const Bignum &b) {
Bignum c;c.v.clear();
int p = 0,g = 0;
while(1) {
int x = g;
if(p < a.v.size()) x += a.v[p];
if(p < b.v.size()) x += b.v[p];
++p;
if(!x) break;
c.v.pb(x % BASE);
g = x / BASE;
}
return c;
}
void print() {
int s = v.size() - 1;
printf("%d",v[s]);
--s;
for(int i = s ; i >= 0 ; --i) {
printf("%08d",v[i]);
}
}
}dp[MAXN][MAXN];
bool vis[MAXN][MAXN];
void get(int a,int b) {
if(a == 0 || b == 0) return;
if(vis[a][b]) return;
dp[a][b] = 1;
vis[a][b] = 1;
for(int i = 0 ; i <= 51 ; ++i) {
int ta = S1.ch[a][i],tb = S2.ch[b][i];
get(ta,tb);
dp[a][b] = dp[a][b] + dp[ta][tb];
}
}
void get2(int a,int b,int dep) {
if(a == 0 || b == 0) return;
s[dep] = 0;if(dep != 0) printf("%s\n",s);
for(int i = 0 ; i <= 51 ; ++i) {
s[dep] = ic[i];
get2(S1.ch[a][i],S2.ch[b][i],dep + 1);
}
}
void Solve() {
read(N);read(M);
scanf("%s%s",x + 1,y + 1);
read(MK);
for(char i = 'A' ; i <= 'Z' ; ++i)
ci[i] = i - 'A',ic[i - 'A'] = i;
for(char i = 'a' ; i <= 'z' ; ++i)
ci[i] = i - 'a' + 26,ic[i - 'a' + 26] = i;
for(int i = 1 ; i <= N ; ++i) S1.Insert(x[i]);
for(int i = 1 ; i <= M ; ++i) S2.Insert(y[i]);
if(MK == 1) get2(1,1,0);
get(1,1);
dp[1][1].print();enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
今天写的题解全是FJOI啊(其实还写了2道JOI的水题,太水了不写题解了)
zxg说让我们看看数学相关的集训队论文,然后做做FJ和SC的省选= =
FJ猫锟 SC YJQ
我们都表示毫不理解该省省选题和该省出题人有什么关系,真的不懂中老年人思维啊
但是反正都是要无脑提高刷题量嘛(大雾)
量变能带来质变
……吗?
39天NOI2018打卡
【LOJ】#2172. 「FJOI2016」所有公共子序列问题的更多相关文章
- LOJ 2172 「FJOI2016」所有公共子序列问题——序列自动机
题目:https://loj.ac/problem/2172 在两个序列自动机上同时走,这样暴搜. 先走字典序小的字符,一边搜一边输出,就是按字典序排序的. 方案数很多,需要高精度?空间很小,要压位. ...
- @loj - 2174@ 「FJOI2016」神秘数
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个可重复数字集合 S 的神秘数定义为最小的不能被 S 的子集的 ...
- Loj #3056. 「HNOI2019」多边形
Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...
- LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)
题意 LOJ #2359. 「NOIP2016」天天爱跑步 题解 考虑把一个玩家的路径 \((x, y)\) 拆成两条,一条是 \(x\) 到 \(lca\) ( \(x, y\) 最近公共祖先) 的 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
随机推荐
- java 注解详解
先引用一下百度百科的名词解析: 定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段. ...
- 4.UiCollection API 详细介绍
一.UiCollection类介绍 UiCollection类两大功能:从集合中查找对象:获取某种搜索条件组件的数量 1.UiCollection类说明 1)UiCollection是UiObject ...
- 「Python-Django」django 实现将本地图片存入数据库,并能显示在web上
1. 将图片存入数据库 关于数据库基本操作的学习,请参见这一篇博客:https://www.cnblogs.com/leejy/p/6745186.html 这里我默认,您已经会了基本操作,能在数据库 ...
- 「Python」python绘制图表
介绍一种简单而又功能强大的绘制图形或报表的包—pyecharts,一个基于Echarts(基于JS的数据可视化库)的图标类库,除了绘制常见的折线图.柱状图.饼图.箱型图和散点图外,还可以绘制3D柱状图 ...
- NOIP模拟赛15
NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day1 T1 天天去哪儿吃 直接枚举 #include<cstdio> #include<algorithm> using ...
- 字符串:KMP
KMP是字符串匹配的经典算法 也是众多字符串基础的重中之重 A. 题意:给T组数据,每组有长度为n和m的母串和模式串.判断模式串是否是母串的子串,如果是输出最先匹配完成的位置,否则输出-1. 做法:直 ...
- Packet Tracer 5.0 构建CCNA实验(3)—— 路由器实现vlan间通信
--交换机配置 --交换机和路由器连接的接口 switchport mode trunk --路由器配置 enable conf t int fa0/0.1 --路由器接口的子接口 encapsula ...
- JAVA多线程提高十三:同步集合类的应用
1.引言 在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的.在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操 ...
- BBScan — 一个信息泄漏批量扫描脚本
github:https://github.com/lijiejie/BBScan 有些朋友手上有几十万甚至上百万个域名,比如,乌云所有厂商的子域名. 如果把这30万个域名全部扔给wvs,APPsca ...
- django框架之中间件
中间件简介 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在djang ...