题目链接:点击查看

题目大意:给出一个只由数字 1 ~ 9 组成的字符串 s,首先规定 f( l , r ) 为字符串 s 的区间 [ l , r ] 中的数位和,再规定 x-prime 需要同时满足以下条件:

  1. f( l1 , r1 ) = x
  2. 不存在 ( l2 , r2 ),使得:
    1. l1 <= l2 <= r2 <= r1
    2. f( l2 , r2 ) != x
    3. x 可以被 f( l2 , r2 ) 整除

问最少删掉字符串 s 中的多少个字母,可以使得整个字符串中不含有 x-prime

题目分析:首先对 x ∈ [ 1 , 20 ] 都打个表,发现当 x = 19 时,有最多的 x-prime ,为 2399 个,这样对于每个 x 就可以将需要删除的匹配串暴力dfs出来,这样问题就变得和之前一道题目很像了:https://blog.csdn.net/qq_45458915/article/details/104243061

只不过那道题目是对相应的位置修改为别的字母,这个题目是直接将相应位置删除了,在 dp 转移的过程中有点小的区别,其他的几乎都一模一样了

dp[ i ][ j ] 代表到了字符串 s 的第 i 个位置,状态为 j 时的最小删除数,转移的话,因为是可以删除,所以 dp[ i + 1 ][ j ] = dp[ i ][ j ] + 1 这个代表需要将第 i + 1 位删除,而当 trie[ j ][ s[ i ] ] 不是 x-prime 时,可以不用删除,也就是 dp[ i + 1 ][ trie[ j ][ s[ i ] ] ] = dp[ i ][ j ]

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e3+100;const int M=5e3+100;int trie[M][10],fail[M],cnt;bool vis[M];char s[M],str[N];int dp[N][M],x;void insert_word()
{int len=strlen(s);int pos=0;for(int i=0;i<len;i++){int to=s[i]-'0';if(!trie[pos][to])trie[pos][to]=++cnt;pos=trie[pos][to];}vis[pos]=true;
}void getfail()
{queue<int>q;for(int i=0;i<10;i++){if(trie[0][i]){fail[trie[0][i]]=0;q.push(trie[0][i]);}}while(!q.empty()){int cur=q.front();q.pop();vis[cur]|=vis[fail[cur]];for(int i=0;i<10;i++){if(trie[cur][i]){fail[trie[cur][i]]=trie[fail[cur]][i];q.push(trie[cur][i]);}elsetrie[cur][i]=trie[fail[cur]][i];}}
}void dfs(int sum,int step)
{if(sum>x)return;if(sum==x){s[step]=0;for(int i=0;i<step;i++){int d=0;for(int j=i;j<step;j++){d+=s[j]-'0';if(x%d==0&&x!=d)goto end;}}insert_word();end:;return;}for(int i=1;i<=9;i++){s[step]=i+'0';dfs(sum+i,step+1);}
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);scanf("%s%d",str,&x);dfs(0,0);getfail();int n=strlen(str);memset(dp,inf,sizeof(dp));dp[0][0]=0;for(int i=0;i<n;i++)for(int j=0;j<=cnt;j++)if(dp[i][j]<inf){dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1);//得删 int nj=trie[j][str[i]-'0'];if(!vis[nj])//不用删 dp[i+1][nj]=min(dp[i+1][nj],dp[i][j]);}int ans=inf;for(int i=0;i<=cnt;i++)ans=min(ans,dp[n][i]);printf("%d\n",ans);return 0;
}

CodeForces - 1400F x-prime Substrings(AC自动机+dp)相关推荐

  1. uvalive4842(AC自动机+DP)

    题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...

  2. HDU 2296 Ring AC自动机 + DP

    题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路:  AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...

  3. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

  4. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  5. Codeforces 1015F Bracket Substring AC自动机 + dp

    Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...

  6. POJ 3691 DNA repair AC自动机 + DP

    题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道  dp[i][j] 为文本串到 第i ...

  7. 【HDU 4511】小明系列故事——女友的考验(AC自动机+DP)

    Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: ...

  8. CDOJ1633 Video Game Combos [AC自动机+dp]

    题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...

  9. [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)

    题目传送门 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...

最新文章

  1. MySQLdb批量插入数据
  2. HDOJ 4223 (DP)
  3. Shell脚本 批量修改目录下若干文件名
  4. setuna截图怎么放大缩小_实用的高清截图系列小窍门详解,一章带你“真正学会”截图!...
  5. N1刷Android TV,贫民种草指北 篇二:N1盒子:不谈刷机,只谈使用!
  6. 【Java基础-3】吃透Java IO:字节流、字符流、缓冲流
  7. Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization
  8. 【转】HDMI视频分配器的功能及原理
  9. Python分析抖音数据,让视频爆起来!
  10. 感恩中国30年,速速来看甲骨文数据库云大会
  11. 企业项目管理人才培养体系建设及创新思路
  12. android 文件传输_使用“发送到”轻松将文件传输到您的Android设备
  13. SpringBoot学习笔记(六)——Redis数据库
  14. Jmeter系列(68)- BeanShell 内置变量 prev
  15. 牛客小白月赛21 J.Jelly
  16. java记——玩转星星
  17. Http强缓存和协商缓存
  18. 用html做一个15页的页面,html西式甜品网制作(15页)-原创力文档
  19. RHCE模拟练习题整理
  20. 力扣刷题-前k个高频元素

热门文章

  1. @requestparam map 接收前端的值_前端面试总结篇(初级)
  2. MySQL分组查询—简单使用
  3. MySQL 高级 - 触发器 - 查看及删除
  4. RabbitMQ快速入门--消息模型介绍
  5. MyBatis关键配置
  6. 分布式MQ消息存储选择
  7. 微服务和SOA架构的区别
  8. 注解配置声明式事务控制解析
  9. 前端框架:发送请求获取数据的执行逻辑
  10. Git初始化及仓库创建和操作