首页 > 其他分享 >CodeForces 1163D Mysterious Code

CodeForces 1163D Mysterious Code

时间:2022-12-29 14:36:17浏览次数:76  
标签:typedef Code txdy 1163D long int maxn Mysterious define

洛谷传送门

CF 传送门

zxx 的题单来的(

发一个无脑 kmp 自动机 + dp 做法。

看到题就很 dp,考虑设计状态。显然填字母时要知道当前串与 \(s,t\) 的匹配位数,否则就不知道 \(s,t\) 是否完整出现。设 \(f_{i,j,k}\) 表示填到 \(c\) 的第 \(i\) 个字符,与 \(s\) 匹配 \(j\) 位,与 \(t\) 匹配 \(k\) 位。转移可以枚举下一位填的字母。

发现我们需要求出某个串的前 \(i\) 位后接一个字符的匹配位数,这不就是 kmp 自动机干的事情吗。。。于是对 \(s,t\) 建 kmp 自动机,转移就很简单了,大概是 \(f_{i,j',k'} \gets f_{i,j,k} + [j'=|s|] - [k'=|t|]\)。

时间复杂度 \(O(26|c||s||t|)\)。

双倍经验

code
/*

p_b_p_b txdy
AThousandSuns txdy
Wu_Ren txdy
Appleblue17 txdy

*/

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

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

const int maxn = 1010;
const int maxm = 55;

int n, m1, m2, f[maxn][maxm][maxm];
int nxt1[maxn][26], nxt2[maxn][26];
char s[maxn], a[maxn], b[maxn];

void solve() {
	scanf("%s%s%s", s + 1, a + 1, b + 1);
	n = strlen(s + 1);
	m1 = strlen(a + 1);
	m2 = strlen(b + 1);
	for (int i = 1, j = 0; i <= m1; ++i) {
		j = nxt1[j][a[i] - 'a'];
		nxt1[i - 1][a[i] - 'a'] = i;
		for (int k = 0; k < 26; ++k) {
			nxt1[i][k] = nxt1[j][k];
		}
	}
	for (int i = 1, j = 0; i <= m2; ++i) {
		j = nxt2[j][b[i] - 'a'];
		nxt2[i - 1][b[i] - 'a'] = i;
		for (int k = 0; k < 26; ++k) {
			nxt2[i][k] = nxt2[j][k];
		}
	}
	mems(f, -0x3f);
	f[0][0][0] = 0;
	for (int i = 1; i <= n; ++i) {
		for (int j = 0; j <= m1; ++j) {
			for (int k = 0; k <= m2; ++k) {
				if (f[i - 1][j][k] < -1e9) {
					continue;
				}
				for (char ch = (s[i] == '*' ? 'a' : s[i]); ch <= (s[i] == '*' ? 'z' : s[i]); ++ch) {
					int nj = nxt1[j][ch - 'a'], nk = nxt2[k][ch - 'a'];
					f[i][nj][nk] = max(f[i][nj][nk], f[i - 1][j][k] + (nj == m1) - (nk == m2));
				}
			}
		}
	}
	int ans = -1e9;
	for (int i = 0; i <= m1; ++i) {
		for (int j = 0; j <= m2; ++j) {
			ans = max(ans, f[n][i][j]);
		}
	}
	printf("%d\n", ans);
}

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

标签:typedef,Code,txdy,1163D,long,int,maxn,Mysterious,define
From: https://www.cnblogs.com/zltzlt-blog/p/17012430.html

相关文章

  • [AtCoder Grand Contest 018] D: Tree and Hamilton Path (agc018D)
    原题链接​​​https://agc018.contest.atcoder.jp/tasks/agc018_d​​Description给出一棵N个点带边权的树现在有一个N个点的完全图,一条边x,y的长度是这两点的在树上最短......
  • [AtCoder Grand Contest 071] E: Jigsaw (agc071E)
    原题链接​​​https://agc017.contest.atcoder.jp/tasks/agc017_e​​Description给出N块拼图每块拼图宽度为3,高度为相同的H拼图由3个宽度为1的部分拼接而成,第一部分......
  • Codeforces 随机补题记录
    日期序号题号点评12.2029CF1694E很有借鉴意义的化用算法题12.2138CF1713F子集启蒙题12.2954CF1761E有很多细节,要想清楚,下次不要面向数据编程了......
  • Spagetti code and keyboard symbols
    Whatisspaghetticodeexactly?Spaghetticodeisthegeneraltermusedforanysourcecodethat’shardtounderstandbecauseithasnodefinedstructure.Whi......
  • Educational Codeforces Round 7
    EducationalCodeforcesRound7https://codeforces.com/contest/622/problems3/6:ABDA.InfiniteSequence水题#include<bits/stdc++.h>usingnamespacestd;i......
  • Python 2.7 十六进制字符数组 转 字符串 (字符是Unicode字符)
    有一串十六进制数据,是Uncode字符。importstructstrhex='003100310031'buf=strhex.decode("hex")value=u''slen=len(buf)/2si=0whilesi<slen:tmp=buf[si......
  • vscode+eslint项目规范化,自动格式化配置(项目中用到的)
    项目如果没有格式化插件就会变得十分拥挤,并且因为个人的开发习惯不同,会导致多人配合的时候,某些人的格式不能与你的兼容导致项目大面积冲突,这样一来统一的格式和开发规范就......
  • 在VSCode中配置代码自动 eslint 格式化 (实测有用)
    一、EslintEslint是用来检测和规范代码格式的工具,应用在工程化项目中,可以保证项目代码格式的一致性和规范性,大大提升了代码的可读性。 二、配置过程本博客是讲述对一......
  • Leetcode203
    题意:去掉给定头ListNode*head的单链表内val等于一个给定val的节点并返回头思路:此题删除链表中元素是很简单的,只需要让待删节点之前一个节点指向待删节点之后一个节......
  • LeetCode 寻找数组的中心下标算法题解 All In One
    LeetCode寻找数组的中心下标算法题解AllInOne724.FindPivotIndex寻找数组的中心下标"usestrict";/****@authorxgqfrms*@licenseMIT*@copyr......