1400F - x-prime Substrings

首先发现 \(x\) 很小,所以发现对应的 x-prime 字符串数也很少,最多的情况是 \(x = 19\),有 2399 个,先爆搜出来。

现在问题变成了,删去最少的字符,使字符串内没有这些模式串。

那么建 AC 自动机,把模式串终点标记,即在非终点行走,每次可以跳过字符,求跳过的最小值。

DP 一下,设 \(f_{i, u}\) 为前 \(i\) 个字符,当前在 AC 自动机上的 \(u\) 号节点,其中没有 x-prime 子串,删除字符的最小值。

  • 有边 \((u, v)\),即从 \(u\) 走 \(s[i + 1]\) 字符到 \(v\),若 \(v\) 点合法,即 \(f_{i + 1, v} = f_{i, u}\)
  • 也可以不走,原地不动,\(f_{i + 1, u} = f_{i, u} + 1\)

滚动数组可以滚掉第一维,这样空间就够了。最坏 \(x = 19\) 时 AC 自动机有 5000 左右的点数。

最坏复杂度 \(5000 \times 1000 = 5\times 10^6\)。跑得过。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std; typedef long long LL; const int N = 2005, S = 5005, INF = 0x3f3f3f3f; int n, x, d[N], cnt, tr[S][9], fail[S];
int idx, f[S], g[S], q[S]; bool match[S]; char s[N]; bool inline check(int m) {
for (int i = 1; i <= m; i++) {
int s = 0;
for (int j = i; j <= m; j++) {
s += d[j];
if (s != x && x % s == 0) return false;
}
}
return true;
} void inline insert(int m) {
int p = 0;
for (int i = 1; i <= m; i++) {
int ch = d[i] - 1;
if (!tr[p][ch]) tr[p][ch] = ++idx;
p = tr[p][ch];
}
match[p] = true;
} void dfs(int u, int rest) {
if (!rest) {
if (check(u - 1)) insert(u - 1);
return;
}
for (int i = 1; i <= min(rest, 9); i++) {
d[u] = i;
dfs(u + 1, rest - i);
}
} void inline build() {
int hh = 0, tt = -1;
for (int i = 0; i < 9; i++)
if (tr[0][i]) q[++tt] = tr[0][i];
while (hh <= tt) {
int u = q[hh++];
for (int i = 0; i < 9; i++) {
int &v = tr[u][i];
if (!v) v = tr[fail[u]][i];
else fail[v] = tr[fail[u]][i], q[++tt] = v;
}
}
} int main() {
scanf("%s%d", s + 1, &x);
n = strlen(s + 1);
dfs(1, x);
build();
memset(f, 0x3f, sizeof f); f[0] = 0;
for (int i = 1; i <= n; i++) {
int ch = s[i] - '1';
for (int j = 0; j <= idx; j++) g[j] = f[j], f[j] = INF;
for (int j = 0; j <= idx; j++) {
if (g[j] != INF) {
f[j] = min(f[j], g[j] + 1);
int v = tr[j][ch];
if (!match[v]) f[v] = min(f[v], g[j]);
}
}
}
int ans = 2e9;
for (int i = 0; i <= idx; i++) ans = min(ans, f[i]);
printf("%d\n", ans);
return 0;
}

CF1400F - x-prime Substrings的更多相关文章

  1. Java 素数 prime numbers-LeetCode 204

    Description: Count the number of prime numbers less than a non-negative number, n click to show more ...

  2. Prime Generator

    Peter wants to generate some prime numbers for his cryptosystem. Help him! Your task is to generate ...

  3. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

  4. [LeetCode] Unique Substrings in Wraparound String 封装字符串中的独特子字符串

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...

  5. UVa 524 Prime Ring Problem(回溯法)

    传送门 Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbe ...

  6. Sicily 1444: Prime Path(BFS)

    题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...

  7. hdu 5901 count prime & code vs 3223 素数密度

    hdu5901题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5901 code vs 3223题目链接:http://codevs.cn/problem ...

  8. 最小生成树 prime zoj1586

    题意:在n个星球,每2个星球之间的联通需要依靠一个网络适配器,每个星球喜欢的网络适配器的价钱不同,先给你一个n,然后n个数,代表第i个星球喜爱的网络适配器的价钱,然后给出一个矩阵M[i][j]代表第i ...

  9. 最小生成树 prime poj1258

    题意:给你一个矩阵M[i][j]表示i到j的距离 求最小生成树 思路:裸最小生成树 prime就可以了 最小生成树专题 AC代码: #include "iostream" #inc ...

随机推荐

  1. 服务和进程管理及查看分区和cpu

    查看分区:cat /proc/partitions   [root@lbg init.d]# cat /proc/partitions major minor  #blocks  name       ...

  2. Ceph 状态报警告 pool rbd has many more objects per pg than average (too few pgs?)

    定位问题 [root@lab8106 ~]# ceph -s cluster fa7ec1a1-662a-4ba3-b478-7cb570482b62 health HEALTH_WARN pool ...

  3. MFC读写文件详解

    1.CFile类提供了对文件进行打开,关闭,读,写,删除,重命名以及获取文件信息等文件操作的基本功能,足以处理任意类型的文件操作. 虽然使用CArchive类内建的序列化功能是保存和加载持久性数据的便 ...

  4. Django解决(1146, "Table 'd42.django_session' doesn't exist")方法

    执行 ./manage.py makemigrations sessions ./manage.py migrate sessions

  5. css3系列之text的常用属性 和 Multi-column(多列)

    text(文本) white-space: word-break word-wrap/overflow-wrap text-align: word-spacing letter-spacing tex ...

  6. 日常踩坑-------新手使用idea

    mybatis在idea的maven项目中的坑 今天遇到mybatis的报错,搞了好久才搞懂,在网上找了好久的相似案例,也没有搞定,先来看下网上常见的解决办法吧,相信也能解决大部分人的报错. 1.ma ...

  7. 《高并发下的.NET》第2季 - 《memcached连接暴增案》第1集:问题表现

    在<.NET 5.0 背锅案>第7集-大结局之后,园子和 .NET 继续过上了幸福生活...剧情很美好,现实很残酷...现实是旧案刚结,新案立至,而且新案与旧案有关联,被迫继续拍剧,并对该 ...

  8. P3287 [SCOI2014]方伯伯的玉米田

    首先可以证明,一定存在一种最优解,每次选择的区间结尾都是 \(n\).因为如果某一个区间结尾不是 \(n\),将其替换成 \(n\) 仍然保持单调不下降.接着都按这个策略拔高玉米. 令 \(f_{i, ...

  9. JavaSE 学习笔记06丨并发

    Chapter 12. 并发 12.1 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,并发指的是在一段时间内宏观上有多个程 ...

  10. java线程与内存的关系

    转载: https://blog.csdn.net/hellozhxy/article/details/91972846