首页 > 其他分享 >CodeForces 946F Fibonacci String Subsequences

CodeForces 946F Fibonacci String Subsequences

时间:2023-10-24 16:26:18浏览次数:44  
标签:typedef 946F const String ll long Subsequences define mat

洛谷传送门

CF 传送门

duel 的时候差点不会 2400 了。

套路地,考虑每个 \(F(x)\) 中与 \(s\) 相同的子序列的贡献。设这个子序列为 \(F(x)_{p_1}, F(x)_{p_2}, F(x)_{p_3}, \ldots, F(x)_{p_n}\)。

我们想要它成为一个子序列的子串,那么 \(F(x)_{[p_1, p_n]}\) 中除了 \(p_1 \sim p_n\) 就不能有别的字符被选。而 \([1, p_1 - 1] \cup [p_n + 1, |F(x)|]\) 中的每个字符都可以选或不选,相当于每个字符产生 \(2\) 的贡献。

如果我们设 \(f_{i, j}\) 为考虑到 \(F(x)\) 的第 \(i\) 位,匹配到 \(s\) 的第 \(j\) 位的答案,那么相当于 \(f_{i + 1, 0} \gets 2 f_{i, 0}, f_{i + 1, n} \gets 2 f_{i, n}, \forall j \in [1, n - 1], f_{i + 1, j} \gets f_{i, j}, \forall j \in [1, n] \land F(x)_i = s_j, f_{i + 1, j} \gets f_{i, j - 1}\)。答案即为 \(f_{|F(x)|, n}\)。

可以用矩阵刻画这个转移过程。设 \(F_i\) 为 \(F(i)\) 的转移矩阵,那么 \(F_i = F_{i - 1} F_{i - 2}\)。

时间复杂度 \(O(n^3x)\)。

code
// Problem: F. Fibonacci String Subsequences
// Contest: Codeforces - Educational Codeforces Round 39 (Rated for Div. 2)
// URL: https://codeforces.com/problemset/problem/946/F
// Memory Limit: 256 MB
// Time Limit: 3500 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 110;
const ll mod = 1000000007;

ll n, m;
char s[maxn];

struct mat {
	ll a[110][110];
	mat() {
		mems(a, 0);
	}
} f[maxn];

inline mat operator * (const mat &a, const mat &b) {
	mat res;
	for (int k = 0; k <= n; ++k) {
		for (int i = 0; i <= n; ++i) {
			for (int j = 0; j <= n; ++j) {
				res.a[i][j] = (res.a[i][j] + a.a[i][k] * b.a[k][j]) % mod;
			}
		}
	}
	return res;
}

void solve() {
	scanf("%lld%lld%s", &n, &m, s + 1);
	f[0].a[0][0] = f[0].a[n][n] = f[1].a[0][0] = f[1].a[n][n] = 2;
	for (int i = 1; i < n; ++i) {
		f[0].a[i][i] = f[1].a[i][i] = 1;
	}
	for (int i = 1; i <= n; ++i) {
		if (s[i] == '0') {
			f[0].a[i - 1][i] = 1;
		} else {
			f[1].a[i - 1][i] = 1;
		}
	}
	for (int i = 2; i <= m; ++i) {
		f[i] = f[i - 1] * f[i - 2];
	}
	mat ans;
	ans.a[0][0] = 1;
	ans = ans * f[m];
	printf("%lld\n", ans.a[0][n]);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,946F,const,String,ll,long,Subsequences,define,mat
From: https://www.cnblogs.com/zltzlt-blog/p/17785083.html

相关文章

  • LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项
    一、前言大家在开发过程中必不可少的和日期打交道,对接别的系统时,时间日期格式不一致,每次都要转化!每次写完就忘记了,小编专门来整理一篇来详细说一下他们四个的转换的方法,方便后面使用!!二、LocalDateTime、LocalDate、Date三者联系这里先说一下,为什么日期有Date了,还在JDK8中推出......
  • C++常用语法知识-- std::istringstream
    C++常用语法知识--std::istringstream介绍std::istringstream是C++标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型。通常从字符串中解析数据,例如整数、浮点数等。使用方法创建std::istringstream对象,首先,需要创建一个std::istringstream对象,将......
  • 宝塔:续签SSL证书报错string indices must be integers
    网站SSL证书过期,续签的时候,报错stringindicesmustbeintegers。  处理方法:1.点击左侧首页,选择“修复”; 2.修复之后,重新点击网站,设置>>>SSL>>>续签证书,等待流程通过,点击保存即可。 ......
  • StringUtil工具类
    importorg.apache.commons.lang3.StringUtils;importjava.io.UnsupportedEncodingException;importjava.net.URLEncoder;importjava.util.*;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/***字符串操作类,包括分割,转换,大写首字母**/publicclassStr......
  • [924] f-strings in Python
    ref:f-stringsinPythonref:Python'sF-StringforStringInterpolationandFormattingF-strings,alsoknownasformattedstringliterals,areafeatureintroducedinPython3.6thatprovideaconciseandconvenientwaytoembedexpressionsinside......
  • How to use regular expression to match a special meta tag in html string using j
    HowtouseregularexpressiontomatchaspecialmetataginhtmlstringusingjavascriptAllInOnemetatagerror❌consthtml=`<!DOCTYPEhtml><htmllang="en"><head><metaname="twitter:card"content......
  • std::istringstream的用法
    1.概要std::istringstream是C++标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型。它通常用于从字符串中解析数据,例如整数、浮点数等。以下是关于std::istringstream的详细用法:创建std::istringstream对象:首先,你需要创建一个std::istringstrea......
  • 巧用模板字符串将未知变量转换为string类型,避免报错
    可理解为将变量向字符串类型转换的语法糖用法我们通常会遇到需要用String.prototype上的方法处理变量,如果该变量为null、undefined、Object则不能直接用字符串方法,也不易于统一处理为字符串;使用模板字符串包裹该变量,则可以简单粗暴的将任意类型转换为字符串类型,避免报错。案例:......
  • 04String类
    String类字符串是常量,创建之后不可改变。字符串字面值存储在字符串池中,可以共享。Stringstr="Hello";产生一个str对象,字符串Hello在字符串池(常量池)中存储。Stringstr1=newString("Hello");产生两个对象,堆、池里面各存储一个。str1指向堆里面的空间,堆里面指向......
  • c#中string字符串转为json对象
    string转json//字符串转jsonpublicstaticvoidstrJson(){stringjsonText="{"shenzheng":"深圳","beijing":"北京","shanghai":[{"zj1":"zj11","zj2":"zj22"},"zjs"......