首页 > 其他分享 >CodeForces 1845C Strong Password

CodeForces 1845C Strong Password

时间:2023-06-30 23:23:40浏览次数:51  
标签:nxt typedef int CodeForces long maxn 1845C Strong define

洛谷传送门

CF 传送门

我怎么这么多天没写题解了,快来水一篇。

考虑对 \(s\) 串建子序列自动机后 dp。

设 \(n = |s|\)。建子序列自动机,就是求出 \(nxt_{i, j}\) 为 \([i, n]\) 中第一个等于 \(j\) 的位置,不存在则 \(nxt_{i, j} = n + 1\)。

然后我们设 \(f_{i, j}\) 为填到密码的第 \(i\) 位,当前匹配到 \(s\) 串的第 \(j\) 位是否存在。注意我们贪心匹配最前能匹配的位置。注意如果 \(j = n + 1\) 说明匹配不完,即密码已经不是一个 \(s\) 的子序列。

转移枚举当前位填的数位 \(d\),根据子序列自动机可以求得 \([j + 1, n]\) 中第一个 \(d\) 的出现位置,就能转移了。

答案是 \(f_{m, n + 1}\)。

code
// Problem: C. Strong Password
// Contest: Codeforces - Educational Codeforces Round 151 (Rated for Div. 2)
// URL: https://codeforces.com/contest/1845/problem/C
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#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 = 300100;

int n, m, nxt[maxn][11], f[11][maxn];
char s[maxn], a[maxn], b[maxn];

void solve() {
	scanf("%s%d%s%s", s + 1, &m, a + 1, b + 1);
	n = strlen(s + 1);
	for (int i = 0; i < 10; ++i) {
		nxt[n + 1][i] = n + 1;
	}
	for (int i = n; i; --i) {
		for (int j = 0; j < 10; ++j) {
			nxt[i][j] = nxt[i + 1][j];
		}
		nxt[i][s[i] - '0'] = i;
	}
	for (int i = 0; i <= m; ++i) {
		for (int j = 0; j <= n + 1; ++j) {
			f[i][j] = 0;
		}
	}
	f[0][0] = 1;
	for (int i = 1; i <= m; ++i) {
		for (int j = 0; j <= n + 1; ++j) {
			if (f[i - 1][j]) {
				for (int k = a[i] - '0'; k <= b[i] - '0'; ++k) {
					f[i][j == n + 1 ? n + 1 : nxt[j + 1][k]] = 1;
				}
			}
		}
	}
	puts(f[m][n + 1] ? "YES" : "NO");
}

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

标签:nxt,typedef,int,CodeForces,long,maxn,1845C,Strong,define
From: https://www.cnblogs.com/zltzlt-blog/p/17518016.html

相关文章

  • Educational Codeforces Round 151 (Rated for Div. 2)(C,D)
    EducationalCodeforcesRound151(RatedforDiv.2)(C,D)C(dp,子序列自动机)C题目大意就就是给你一个字符串\(s\),还给出两个边界字符串\(l\)和\(r\),长度为\(m\),问我们是否可以构造满足一下条件的字符串\(1\),第\(i\)个字符必须在\(l_i\)和\(r_i\)的双闭区间里面\(2\),......
  • Educational Codeforces Round 151 (Rated for Div. 2) A~D
     A.ForbiddenInteger模拟:voidsolve(){intn,k,x;cin>>n>>k>>x;if(x!=1){cout<<"YES\n"<<n<<"\n";for(inti=1;i<=n;i++)cout<<"1"<<"\n"......
  • CF1845C Strong Password
    思路这场edu爆炸了,特此记录。由于\(m\le10\),因此可以直接考虑搜索。对于定义状态为\((idx,cur)\),表示当前在填密码的第\(idx\)位,且使用了\(s\)中的前\(cur\)个字符。首先注意到对于同一个数字,如果其在\(s\)中出现了不止一次,那么出现在前边的显然比出现在后边的潜......
  • Educational Codeforces Round 151 (Rated for Div
    C.StrongPassword给定一个字符串\(s\),一个密码的长度\(m\),下界字符串\(l\)和上界字符串\(r\),上下界字符串长度均为\(m\),且字符只在0~9范围内,上界字符串的第\(i\)位非严格大于下界字符串的第\(i\)位,密码的第\(i\)位需要位于\([l_i,r_i]\)内。问是否存在一个密码不是\(......
  • Codeforces 1458F - Range Diameter Sum
    先考虑直径的一些求法:最普遍的想法肯定是从点集中任意一个点开始DFS找到距其最远的点,再一遍DFS找到距离你找到的那个点最远的点。但是放在这个题肯定是不太行的。因此考虑一种更常用的求法:合并。更直观地说:我们定义树上一个圆\((x,r)\)表示距离\(x\)点\(\ler\)的所有点......
  • Codeforces[CF1036B]Diagonal Walking v.2题解
    题目大意很明显,这道题就是求k步之内到达点\((a,b)\),然后尽量走对角线,求能走对角线的最大值。做题思路首先明白一个事实,即一个对角线可以通过增加一步而抵达点不变,如图:我们可以这样思考这道题,在到达目的地以后,剩余步数如果为双数,则在对角线来回走,最后会到目的地。但如果剩......
  • Codeforces Round 881 (Div. 3)
    失踪人口回归VP打的A.SashaandArrayColoringintn;inta[maxN];voidsolve(){ n=rd(); fp(i,1,n)a[i]=rd(); sort(a+1,a+n+1); llans=0; for(inti=1;i*2<=n;++i) ans+=(a[n-i+1]-a[i]); cout<<ans<<endl;}B.LongLongintn;inta[maxN......
  • Codeforces 1648F - Two Avenues
    为啥会有人觉得这是板子题啊/tuu先对图边双连通分量缩个点,然后考虑对两条边分情况讨论:两个桥边,显然答案就是经过这两个桥的路径数量之和,排序取前两大的即可。一个桥边加一个非桥边,答案是经过那个桥边的路径数量,显然桥边数量\(\ge2\)肯定不用考虑这种情况,桥边数量\(=1\)另......
  • CodeForces 605E Intergalaxy Trips 题解
    题意有一张\(n\)个点的有向完全图,边\(i\toj\)有\(p_{i,j}\)的概率出现(\(p_{i,i}=1\))。你要从\(1\)开始,每天可以走一条出边或留在原地,求最优策略下走到\(n\)的期望天数。输出小数(不取模)。\(n\le10^3\)思路设\(f(i)\)表示从\(i\)走到\(n\)的期望天数,那么......
  • Codeforces 1787H - Codeforces Scoreboard(平衡树优化 dp)
    令\(c_i=b_i-a_i\),等价于我们钦定一个排列\(p\),最小化\(\sum\min(p_ik_i,c_i)\),拿\(\sumb_i\)减去之就是答案。我们钦定一些\(i\)满足\(p_ik_i<c_i\),根据排序不等式,这些\(p_i\)肯定按\(k\)从大到小的顺序依次填入\(1,2,3,\cdots\)。这样就可以DP了:将\(k\)从大......