首页 > 其他分享 >Codeforces Round #820 (Div. 3) G. Cut Substrings

Codeforces Round #820 (Div. 3) G. Cut Substrings

时间:2022-09-20 23:48:56浏览次数:114  
标签:Cut minn int ll Codeforces add include Round size

DP

Problem - G - Codeforces

题意

给一个长度为 \(n(1<=n<=500)\) 的主串 s,一个长度为 \(m(1<=m<=500)\) 的模式串 t,每次可以将当前的 s 中与 t 相同的子串变成一串 "."(如 \(s=ababa,\;t=aba\), 一次操作后 \(s=...ba或ab...\))

求最小的操作次数使 s 中不包含与 t 相同的子串;并且求在最小操作次数下的操作的方案数

思路

  1. 看数据范围可知大概率是 \(O(n^3)\) 的 dp
  2. 类似区间分组优化dp,可令 \(f[i][j][k]\) : 前 i 项消除了 t,最后一个"."在 j,花了 k 次的方案数
  3. 可优化一维,\(f[i][k]\): 前 i 项消除了 t,且最后一次操作就是对 \([i-m+1,i]\) 操作,花了 k 次的方案数
  4. 类比最长公共子序列的 dp 思路,可再优化一维,\(f[i]\): 前 i 项消除了 t,且最后一次操作就是对 \([i-m+1,i]\) 操作的最小操作次数,\(g[i]\): 消除前 i 项中的 t 时,所花次数最小的方案数

​ 这样更新 \(g[i]\) 即可 (i 可由 j 转移而来)

if (f[i] > f[j] + 1)
{
    f[i] = f[j] + 1;
    g[i] = g[j];
}
else if (f[i] == f[j] + 1)
    add(g[i], g[j]);

参考链接:https://zhuanlan.zhihu.com/p/563809110

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>

using namespace std;
#define endl "\n"

typedef long long ll;
typedef pair<int, int> PII;

const int N = 510, mod = 1e9 + 7;

string s, t;
int n, m;
int f[N];
ll g[N];
void add(ll &a, ll b)
{
	a += b;
	if (a >= mod)
		a -= mod;
}
vector<int> a;
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T;
	cin >> T;
	while(T--)
	{
		cin >> s >> t;
		n = s.size();
		m = t.size();
		s = " " + s;
		a.clear();
		//第0段
		a.push_back(0);
		//预处理出可以匹配的段
		for (int l = 1; l + m - 1 <= n; l++)
		{
			int r = l + m - 1;
			if (equal(l, r))
				a.push_back(r);
		}
		fill(f, f + n + 2, 1e9);
		f[0] = 0, g[0] = 1;
		for (int i = 1; i < a.size(); i++)
		{
			for (int j = i - 1; j >= 0; j--)
			{
				//上一段与当前段不能由交集
				if (a[i] - a[j] < m)
					continue;
				bool fl = true;
				//上一段与当前段中间不能有段
				for (int k = j + 1; k < i; k++)
				{
					if (a[k] - a[j] >= m && a[i] - a[k] >= m)
					{
						fl = false;
						break;
					}
				}
				if (!fl)
					break;
				if (f[i] > f[j] + 1)
				{
					f[i] = f[j] + 1;
					g[i] = g[j];
				}
				else if (f[i] == f[j] + 1)
					add(g[i], g[j]);
			}
		}
		int minn = 1e9;
		ll ans = 0;
		for (int i = 0; i < a.size(); i++)
			if (a.back() - a[i] < m)s
				minn = min(minn, f[i]);
		for (int i = 0; i < a.size(); i++)
			if (a.back() - a[i] < m && f[i] == minn)
				add(ans, g[i]);
		cout << minn << " " << ans << endl;
	}
    return 0;
}

标签:Cut,minn,int,ll,Codeforces,add,include,Round,size
From: https://www.cnblogs.com/hzy717zsy/p/16714083.html

相关文章

  • Codeforces Round #821 (Div. 2) ABCD1
    A.ConsecutiveSumhttps://codeforces.com/contest/1733/problem/A题目大意:给定一个长度为n的数组a。最多可以执行k次以下操作:选择两个指数i和j,其中imodk=jmodk......
  • Codeforces Round #821(Div.2) (A-C) 题解
    CodeforcesRound#821(Div.2)(A-C)  A.ConsecutiveSum大致题意给定一组共n个数据,如果俩个数的下标在modk意义下同余,则可以交换a[I]和a[j] ,求操作后一段......
  • Codeforces Round #821 (Div. 2)(持续更新)
    Preface唉LOL打到一半被迫营业开打,感觉这算是第一次自己认真的在线打CF,以我的老年人手速感觉要罚时飞起了10:35开始打到12:10顶不住了睡觉去了,E大概看了个题感觉挺有意思的......
  • Codeforces Round #819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022
    Preface明天的CF一定打啊(绝对不咕),今天白天补现代作业,英语作业到哭,而且还要准备四六级,每天逼着自己背单词A.MainakandArray不难发现换中间的数不会影响答案,因此操作......
  • Codeforces Round #821 D2
    D2.Zero-One(HardVersion)我们由D1可知当我们的y小于x/2时我们可以用2y来减小相邻的cost那我们考虑要是y比较大的时候我们也可以用多个x来减小cost我们可以轻松的......
  • Codeforces Round #821 (Div. 2)
    CodeforcesRound#821(Div.2)C.ParityShuffleSorting题目大意每次操作可以选择l,r,如果\(a_l+a_r\)是奇数可以让\(a_l=a_r\),否则可以让\(a_l=a_r\),要求使用不超过n......
  • Codeforces #821 Div2(A~D2)题解
    CF#821Div2AConsecutiveSum题目:​ 选择\(i\)和\(j\),如果\(j=i+xk(x=R)\),可以交换\(i,j\)。任意选择一段长度为k的相加。思路:​ 题目等价于在下标\(mod\)k相同......
  • Codeforces Round #813 (Div. 2)
    CodeforcesRound#813(Div.2)D.EmptyGraph分析我们通过简单的分析,可以得出一个结论,我们的答案一定来自于相邻两个点的位置或是最小值的两倍。我们考虑如何给构造......
  • [杂项]World.execute(me)
    \[\mathit{Switch~on~the~power~line}\]\[\mathit{Remember~to~put~on}\]\[\mathit{PROTECTION}\]\[\mathit{Lay~down~your~pieces}\]\[\mathit{And~let~^\primes~beg......
  • CF round 812 div2 A-D 题解
    首先第一题TravelingSalesManProblem,给出一些坐标,就是问从原点出发,然后收集所有的点,问最少需要多少次移动这个就是求收集完那曼哈顿距离,这个距离稍加观察可以发现,就是......