poj 3691

POJ3691 DNA repair AC自动机+动态规划 Problem Address:http://poj.org/problem?id=3691 【前言】 关于这道题,我看了好几天。 刚开始确实很不好理解,不知道如何动态规划法。 不过慢慢地就看懂了。 看了很多解题报告,不过写的都不是很清楚。无奈最后终于又看了代码,才渐渐了解过来。 我觉得,很多题目都不是简单地考察一个知识点,而是多个知识点的结合。而我 阅读详情
 

注意当a是b的字串的时候.. 要

#include <iostream>
#include <cstring>
#include <stdio.h>
#include <algorithm>

using namespace std;


const int NODE = 1010;
const int CH = 4;
const int inf = 0xffffff;
int chd[NODE][CH] , cnt;//结点个数
int word[NODE];//关键数组,记录每个单词尾结点的信息,每道题目都不一样
int fail[NODE];//传说中的失败指针
int Que[NODE];//辅助队列
int sw[150];//string swap每个字符对应的Index,方便模板化

void Ins(char *a, int val) {
 int p = 0;
 for(; *a ; a ++) {
  int c = sw[*a];
  if(!chd[p][c]) {
   //CC(chd[cnt] , 0);
   memset( chd[cnt], 0, sizeof( chd[cnt] ));
   word[cnt] = 0;
   chd[p][c] = cnt ++;
  }
  p = chd[p][c];
 }
 word[p] = val;
}

void AC() {
 int *s = Que , *e = Que;
 for ( int i = 0; i < CH; i++ )
    if(chd[0][i]) {
  fail[chd[0][i]] = 0;
  *e++ = chd[0][i];
 }
 while(s != e) {
  int p = *s++;
  for ( int i = 0 ; i < CH; i ++ ) {
   if( chd[p][i] ) {
    int v = chd[p][i];
    *e++ = v;
    fail[v] = chd[fail[p]][i];
    //word[v] += word[fail[v]];
    //对word[v]按word[fail[v]]里的内容进行处理
   } else {
    chd[p][i] = chd[fail[p]][i];
   }
  }
 }
}

void init ()
{
    fail[0] = 0;
 //for( int i = 0; i < CH; i++ ) sw[i] = i;
 sw['A'] = 0;
 sw['G'] = 1;
 sw['C'] = 2;
 sw['T'] = 3;
//下面两句每次都必须初始化
 //CC(chd[0],0);
 memset( chd[0], 0,sizeof( chd[0] ));
 memset ( word , 0 ,sizeof ( word ));
 cnt = 1;
}

//AC()函数处理后 chd[p][i] 就是在p结点进行i转移到达的结点


int dp[1005][1005];
int loc[1005][1005];
char str[55][55];
char p[1004];
int main()
{
    //freopen ( "data1.txt" , "r" , stdin);
    int n ;
    int Case = 0;
    while ( cin >> n , n )
    {
        Case ++;
        init();
        for ( int i = 0 ; i < n; i ++ )
        {
            scanf("%s" , str[i] );
            //Ins( c ,1 );
        }
        char tmp[55];
        for ( int i =0  ;i < n; i ++ )
        {
            Ins( str[i] , 1 );
            for ( int j = 0; j < n; j ++ )
            {
                if( strstr ( str[i] , str[j] ) && strcmp ( str[i], str[j] ) )
                {
                    char * pstr = strstr( str[i] , str[j] );
                    pstr += strlen ( str[j] );
                    //cout << *pstr << endl;
                    //cout << str[i] << endl;
                    //cout << str[j] << endl;
                    //cout << "here" << endl;
                    //char * ps = str[j] ;
                    int k = 0 ;
                    for ( char *ps = str[i]  ; ps != pstr ; ps ++ , k ++ )
                        tmp[k] = *ps;//cout << *ps <<1 <<  endl,getchar();
                    tmp[k] = '\0';
                    //cout << tmp << endl;
                    Ins ( tmp , 1 );
                }
            }
        }
        scanf("%s" , p );
        AC();
        int len = strlen ( p );

        for ( int i = 0 ; i <= len ; i ++ )
            for ( int j = 0 ; j < cnt ; j ++ )
                dp[i][j] = inf;
        dp[0][0] = 0;
        for ( int i = 0 ;  i <= len; i ++ )
            for ( int j = 0 ; j < cnt; j ++ )
            {
                if ( word[j] )
                    continue;
                int temp = 0;
                for ( int k = 0 ; k < 4 ; k ++ )
                {
                    temp = chd[j][k];
                    if ( sw[p[i]] == k )
                        if ( word[temp] )
                            dp[i+1][temp] = inf;
                        else
                            dp[i+1][temp] = min( dp[i][j] , dp[i+1][temp] );
                    else
                        if ( !word[temp])
                            dp[i+1][temp] = min ( dp[i][j] +1 , dp[i+1][temp] );
                }
            }
        int ans = inf;
        for ( int i = 0 ; i < cnt ; i ++ )
            if ( !word[i] )
                ans = min( dp[len][i] , ans );
        //for ( int i = 0 ; i < cnt ; i ++ )
        //    cout << dp[len][i] << endl;
//        for ( int i = 0 ; i <= len ; i ++ )
//            for ( int j = 0 ; j < cnt ; j ++ )
//                printf("dp[%d][%d] = %d\n" , i , j   , dp[i][j] );
        if ( ans >= inf )
            ans = -1 ;
        cout << "Case " << Case << ": " << ans << endl;
    }
    return 0;
}

最新Linux CSI Tools安装教程(两台主机,一发一收)(监控模式) 无线感知之CSI Tools工具安装,最新在监控模式下采集CSI数据, 阅读详情

相关推荐

西门子S7-1200 PLC与伺服电机控制实战解析

工业自动化控制系统中,PLC(可编程逻辑控制器)与伺服电机的协同工作是实现精密运动控制的核心技术。通过PROFINET工业以太网协议,PLC可以高效地控制多台伺服电机,实现定位、同步和插补等复杂运动。在实际工程应用中,硬件组态的正确配置和运动控制算法的优化是关键挑战。本文以西门子S7-1200 PLC控制五台伺服电机的项目为例,详细介绍了从硬件组态、运动控制程序实现到HMI界面设计的全流程。特别针对多轴同步插补运动、动态速度曲线调整等特殊工艺需求,提供了实用的解决方案和调试技巧,为工业自动化领域的工程师提供

weixin_30252709的博客 497

POJ3691 第一道AC自动机+DP 指针版+总结

学了编译原理的自动机后理解起来容易多了,对于一个字符串我只关心最后几个字符组成的前缀是AC自动机中的哪个状态节点,然后在AC自动机上进行转移。 我们可以先构造一个AC自动机,然后把各个节点之间的合法联系做成矩阵,这样就方便后面查询了。 需要注意的地方: 1、判断一个节点是否合法,除了看自身外还要看其父节点和其fail指向的第一个节点。(考虑到子串包含的原因) 2、打合法关系表时,打出合法关

Matrix 882

一文详解心电图(ECG)监测原理

介绍心电图的监测原理,从心电信号产生、获取到心电图的基本组成

m0_50146396的博客 3287

POJ 3691 DNA repair AC自动机 + dp

传送门:POJ3691 题意:给定一个原字符串S和n个禁止模式串p1,p2...pn,请修改字符串S,使得其中不包含任何禁止模式串,只能将S中的字符修改为其他字符而不能增加或删除,如果怎么修改都不行,输出-1,否则输出最少修改次数。 思路:挑战程序设计P370例题,但是白书上不是用ac自动机做的,而是暴力预处理,我看网上dalao都是ac自动机或者说Trie图预处理,就学着写了一发,这也是第一

WA是一笔财富 437

从零搭建PIC MCU开发环境:MPLAB IDE与HI-TECH编译器安装破解全攻略

本文详细介绍了从零搭建PIC MCU开发环境的完整流程,包括MPLAB IDE 8.85的安装配置、HI-TECH C编译器的安装与破解,以及PICkit3编程器的使用技巧。通过清晰的步骤说明和常见问题解决方案,帮助开发者快速搭建稳定的PIC单片机开发环境,适用于PIC16/18系列MCU开发。

weixin_29188997的博客 291

Dify 从入门到熟悉100 天的学习大纲

理解 Dify 的核心概念,熟悉操作界面,并能创建简单的 AI 应用。祝你在这 100 天的旅程中学有所成,成为一名优秀的 AI 应用开发者!掌握生产环境部署、监控、调优,并关注 Dify 生态和前沿动态。探索多模态、Agent、API 集成、性能优化等高级主题。掌握工作流编排、高级提示词技巧、知识库优化等核心功能。

IT深耕十余载,大道之简 1735

poj 3691 AC自动机+dp(修复DNA使其不带病毒)

题意:给定不超过50个由 ‘A’, ‘G’ , ‘C‘ ,’T’。 四个字母组成的模式串,每个模式串长度不超过 20,再给一个不超过1000个字符长的同样由上述字母组成的母串S, 问在S中至少要修改多 少个字符,才能使其不包含任何模式串。 思路:对模式串建立AC自动机。然后在其上进行动态规划。Ans[i][j]表示若要用长度为i的母串的前缀遍历DFA树, 使之达到节点 j ,至少要修改的字符数量

dearmango 599

硬核反坑!YOLOv5训练避坑指南:根治梯度消失、不收敛、检测漏框三大核心问题(附实战代码+调优清单)

数据是基础,超参数是关键,模型是工具,训练策略是保障。梯度消失、不收敛、检测漏框这三大问题,本质上都是“数据-模型-训练”不匹配的结果。梯度消失/爆炸:优先调整学习率策略+梯度裁剪,其次优化模型结构;训练不收敛:优先清洗数据集,其次调优超参数,最后检查配置文件;检测漏框:优先重新聚类锚框,其次增强浅层特征,最后调整推理参数。YOLOv5训练的最高境界,不是调参,而是让数据、模型、训练策略三者完美匹配。按本文的方法反坑,你的YOLOv5训练一定能一次成功!🚀。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 233

poj 3691(AC自动机,新模板)

.题意是说给了N个带病毒的DNA串( DNA串只有AGCT几种单元组成)...再给一长串DNA..问这长串DNA最少改动几个(就是改..不是删除或者添加..)能保证没有包含病毒字串..输出这个最小改动的次数..若怎么修改都带病毒子串...输出-1... 思路:这是我第一道调bug调得快要发狂的代码,AC这道题花了我将近五个小时,md。其实思想很简单,就是将那些病毒DNA建成一棵AC自动机树,然后...

qq_39861441的博客 572

39、信号流图:解决线性代数方程组的图论方法

本文介绍了信号流图理论在求解线性代数方程组中的应用,重点阐述了Coates方法和Mason方法的原理、步骤及对比分析。通过图论视角,将矩阵运算转化为对有向图结构的分析,利用1-因子、1-阶连接、前向路径和反馈回路等概念,推导出方程组解的拓扑公式。文章结合具体实例演示两种方法的计算过程,并总结其在电路分析、控制系统和通信系统等领域的拓展应用,展示了信号流图理论的直观性与有效性。

pear55的博客 87

C# 工业视觉性能极致优化:多线程推理池 + 对象复用 + 批量检测,速度提升 10 倍实战

set;} // 输入图像set;} // 异步返回结果set;} // 用于监控延迟性能优化不是魔法,而是对资源生命周期的精细管理和对硬件特性的充分利用。多线程池解决了 CPU/GPU 闲置问题。对象池解决了 GC 停顿问题。零拷贝解决了总线带宽瓶颈。严格的 Dispose解决了内存泄漏问题。这套架构已在多个高速锂电、3C 电子检测产线落地,轻松应对 200ms 甚至 50ms 的严苛节拍。记住,在工业领域,稳定性与速度同等重要。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 300

poj3691(ac自动机+dp)

链接:点击打开链接 题意:给出一个母串,和n个子串问最少修改几个字母能使母串不含任何一个子串,如果不能输出-1 代码:#include #include #include #include #include #include using namespace std; const int INF=0x3f3f3f3f; int dp[1005][1005]; int fail[100

stay_accept的专栏 1026

使用 Simulink/Simscape Electrical/Stateflow,构建一个并网逆变器短路故障动态响应与恢复策略仿真模型

本文基于Simulink平台,详细介绍了并网逆变器短路故障的动态响应与恢复策略仿真方法。主要内容包括:1)构建包含热模型的高精度逆变器模型;2)模拟IGBT击穿和桥臂直通两种短路故障;3)设计基于Stateflow的微秒级快速保护逻辑;4)实现放电、去磁、自检、重启的完整恢复流程。仿真结果表明,所提出的保护方案能在200μs内有效限制故障电流,避免器件永久损坏,并通过标准化恢复流程实现系统安全重启。文章还探讨了硬件保护协同、多级保护和预测保护等高级策略,为电力电子系统安全防护提供了实用解决方案。

xiaoheshang_123的博客 107

POJ 3691 DNA repair AC自动机+DP -

题目地址:http://poj.org/problem?id=3691 思路: 把所有节点建一棵trie树 那么我们要做的 就是把母串在树上搜索,而且在搜索的时候不会碰到危险节点 也即是对于节点j有条字母边a到son[j] , 1)如果son[j]是危险节点,那么换一条j的边 2)如果son[j]为空,就顺着前驱节点找另一个字母边a 3)如果以上都不是,那么比较a和插入母串的字符,如

BRCOCOLI的博客 350

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

POJ 3691 DNA repair

POJ_3691     这个题目可以直接在生成的trie图的“安全部分”进行dp,用f[i][j]表示第i步走到第j个节点时,最少repair了几个基因。     具体的建立trie图的思想可以参考《Trie图的构建、活用与改进》这篇文章。 #include&lt;stdio.h&gt;#include&lt;string.h&gt;#define MAXD 1010#define I...

weixin_34124939的博客 146

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

poj3691 DNA repair dp AC自动机

poj3691 DNA repair 题意:求母串最少改变几个字母是母串的子串不含有匹配串。 题解:实在没有力气 并没有理解呜呜呜 贴一个我认为不错的吧 http://blog.youkuaiyun.com/wugj03/article/details/6763145#include<iostream> #include<cstdio> #include<cstring> #include<queue>

yxr0105 527

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【poj3691-DNA repair】AC自动机+DP

【poj3691-DNA repair】AC自动机+DP 题意:给n个病毒DNA序列,再给一个DNA序列,问该序列至少修改多少个碱基能不含任何病毒DNA。病毒DNA序列一共不超过1000,询问的DNA长度不超过1000。 题解:DP:d[l][p]表示询问到第l位、当前在AC自动机上的位置为p时的最少修改数,用d[l][p]推d[l+1][x]。...

qq_25768269的博客 128

POJ-3691 DNA repair AC自动机+DP

  题目链接:http://poj.org/problem?id=3691   首先庆祝1A。   如果是单串的匹配,那么状态转移方程就是f[i][j],表示匹配串的前 i 位最近9个数字的状态是 j 的最小改动,每个状态用状态压缩表示下就可以了。复杂度是指数级,对于较小的字符串还是可以接受的。但是这个有很多不必要的情况,因为很多转移都可以归纳到一起,即修改或者不修改,因此把方程改为表示匹...

weixin_30413739的博客 102

Stoer-Wagner算法训练题目合集 hdu 3691 hdu3002 poj 2914

题意:都是求全局最小割 思路:训练时发现网络流是我们队伍一大缺陷,就看了一天多的网络流,然后也学会了Stoer-Wagner算法 要注意的是输入会有重边,所以不能只赋值一次,这个做任何图论题都要注意 hdu 3691:http://acm.hdu.edu.cn/showproblem.php?pid=3691 #include #include #inc

zyh 721

AC自动机+DP(POJ2778&&POJ3691)

AC自动机+DP傻X题

蜜の夜明け 632

[poj3691] DNA repair

题目描述Biologists finally invent techniques of repairing DNA that contains segments causing kinds of inherited diseases. For the sake of simplicity, a DNA is represented as a string containing characters

Bill_Yang_2016的博客 523

POJ - 3691 DNA repair

POJ - 3691 DNA repair Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description Biologists finally invent technique

WilliamCode的博客 775

poj 3691 DNA repair

题目链接:http://poj.org/problem?id=3691 题目大意:已知一个DNA串和一些病毒DNA序列,求出最少改变DNA串中多少个字符,能使得串中不包含任意一个病毒序列。 题目思路:ac自动机加简单dp. #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;string.h&gt; #include&...

java开发指南博客 【转载】 163
上一篇: 看到的
下一篇: 状态dp 第一道
Sov_Matrix
博客等级 码龄17年 0粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值