洛谷 P1032 字串变换

题目描述

已知有两个字串 A,B 及一组字串变换的规则(至多 6 个规则),形如:

  • A1​→B1​。
  • A2​→B2​。

规则的含义为:在 A 中的子串 A1​ 可以变换为 B1​,A2​ 可以变换为 B2​⋯。

例如:A=abcd,B=xyz,

变换规则为:

  • abc→xu,ud→y,y→yz。

则此时,A 可以经过一系列的变换变为 B,其变换的过程为:

  • abcd→xud→xy→xyz。

共进行了 3 次变换,使得 A 变换为 B。

输入格式

第一行有两个字符串 A,B。

接下来若干行,每行有两个字符串 Ai​,Bi​,表示一条变换规则。

输出格式

若在 10 步(包含 10 步)以内能将 A 变换为 B,则输出最少的变换步数;否则输出 NO ANSWER!

输入输出样例

输入 #1

abcd xyz
abc xu
ud y
y yz

输出 #1

3

说明/提示

对于 100% 数据,保证所有字符串长度的上限为 20。

【题目来源】

NOIP 2002 提高组第二题

解题思路

采用广度搜索,字符串匹配采用朴素模式匹配也可以,需要注意的是,主串可能有多个子串匹配成功,在bfs中都需要加入列队(别看只有6个规则,列队数组却比较大,不然RE等你)

AC代码

#include<stdio.h>
#include<string.h>
struct nb {//储存变化规则char s[23];//变化前char h[23];//变化后
}e[8];
struct linknode {//列队char g[23];//串int s;//步数
}link[2110000];
int main()
{int k = 1;char a[23], b[23];scanf("%s %s", a, b); //输入起始串和终止串while (scanf("%s %s", e[k].s, e[k].h)!=EOF)//输入规则k++;int hard = 1, tail = 2, flag = 0;strcpy(link[1].g, a); link[1].s = 0;//起始串入队while (hard < tail && link[hard].s < 10){for (int i = 1; i < k; i++)//列举所有变化规则{int x = 0, y = 0;int p = strlen(link[hard].g);int q = strlen(e[i].s);while (x < p)//继续寻找主串后面是否有匹配的{while (x < p && y < q)//朴素模式匹配{if (link[hard].g[x] == e[i].s[y]){x++; y++;}else{x = x - y + 1;y = 0;}}if (y == q)//y==q代表匹配成功{int mm = 0;//入队操作for (int j = 0; j < x - y; j++)link[tail].g[mm++] = link[hard].g[j];int hj = strlen(e[i].h);for (int j = 0; j < hj; j++)link[tail].g[mm++] = e[i].h[j];for (int j = x; j < p; j++)link[tail].g[mm++] = link[hard].g[j];link[tail].g[mm] = '\0'; link[tail].s = link[hard].s + 1;if (strcmp(link[tail].g, b) == 0)//如果找到终点串结束{flag = 1;break;}tail++;}y = 0;}if (flag == 1)break;}if (flag == 1)break;hard++;//一个点广搜结束进行下一个}if (flag == 1)//找到终点串{if (link[tail].s <= 10)printf("%d", link[tail].s);elseprintf("NO ANSWER!");}else//没找到终点串printf("NO ANSWER!");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tensorflow2.0笔记 - tensor排序操作

本笔记主要记录sort,argsort,以及top_k操作&#xff0c;加上一个求Top K准确度的例子。 import tensorflow as tf import numpy as nptf.__version__#sort,argsort#对1维的tensor进行排序 tensor tf.random.shuffle(tf.range(10)) print(tensor) #升序 print("tf.sort(d…

纯血鸿蒙来了,企业开发者应该关注什么

2024年对于鸿蒙来说是一个里程碑&#xff0c;鸿蒙将正式对外发布 HarmonyOS NEXT 5.0&#xff0c;而此前传言的系统将不再对开发者层面兼容Android等消息将成为定论。 为什么鸿蒙能有这个底气&#xff1f;因为研究机构TechInsights发布预测报告称&#xff0c;华为HarmonyOS将在…

【Chrome】浏览器怎么清除缓存并强制刷新

文章目录 1、正常刷新&#xff1a;正常刷新网页&#xff0c;网页有缓存则采用缓存。 F5 或 刷新键2、强制刷新&#xff1a;忽略缓存刷新&#xff0c;重新下载资源不用缓存。 CtrlF5 或 ShiftF5 或 CtrlShiftR3、在浏览器的设置里面清除所有数据

基于 Docker 搭建 Uptime-Kuma 一个极简风的应用监控

GitHub&#xff1a;https://github.com/louislam/uptime-kuma 一、uptime-kuma 介绍 Demo&#xff1a;https://uptime.wuhanjiayou.cn/ uptime-kuma 是一款开源的监控工具, 支持 TCP / PING / HTTP 等多种监控方式&#xff0c;可监测网站&#xff0c;数据库&#xff0c;Docker…

如何在 Ubuntu 20.04 上安装 MySQL

介绍 MySQL是一个开源数据库管理系统&#xff0c;通常作为流行的LAMP&#xff08;Linux、Apache、MySQL、PHP/Python/Perl&#xff09;堆栈的一部分安装。它实现关系模型并使用结构化查询语言&#xff08;更称为 SQL&#xff09;来管理其数据。 本教程将介绍如何在 Ubuntu 20…

OpenHarmony—类型转换仅支持as T语法

规则&#xff1a;arkts-as-casts 级别&#xff1a;错误 在ArkTS中&#xff0c;as关键字是类型转换的唯一语法&#xff0c;错误的类型转换会导致编译时错误或者运行时抛出ClassCastException异常。ArkTS不支持使用语法进行类型转换。 当需要将primitive类型&#xff08;如num…

使用Spring Boot和Tess4J实现本地与远程图片的文字识别

概要&#xff1a; 在本文中&#xff0c;我们将探讨如何在Spring Boot应用程序里集成Tess4J来实现OCR&#xff08;光学字符识别&#xff09;&#xff0c;以识别出本地和远程图片中的文字。我们将从添加依赖说起&#xff0c;然后创建服务类以实现OCR&#xff0c;最后展示如何处理…

C++:组合、继承与多态

面向对象设计的重要目的之一就是代码重用&#xff0c;这也是C的重要特性之一。代码重用鼓励人们使用已有的&#xff0c;得到认可并经过测试的高质量代码。多态允许以常规方式书写代码来访问多种现有的且已专门化了的相关类。继承和多态是面向对象程序设计方法的两个最主要的特性…

小程序 样式 WXSS

文章目录 样式 WXSS尺⼨单位样式导⼊选择器⼩程序中使⽤less 样式 WXSS WXSS( WeiXin Style Sheets )是⼀套样式语⾔&#xff0c;⽤于描述 WXML 的组件样式。 与 CSS 相⽐&#xff0c;WXSS 扩展的特性有&#xff1a; 响应式⻓度单位 rpx样式导⼊ 尺⼨单位 rpx &#xff08;…

Python中的多线程和多进程编程

Python中的多线程和多进程编程是实现并发和并行计算的重要手段。下面分别介绍这两种编程方式。 多线程编程 Python中的多线程编程可以使用内置的threading模块来实现。threading模块提供了线程的创建、同步、通信等操作。 要使用多线程&#xff0c;首先需要导入threading模块…

【PriorityQueue 之 接口介绍and堆排序】

文章目录 常用接口介绍PriorityQueue的性质插入/删除/获取优先级最高的元素 top-k问题&#xff1a;最大或最小的前k个数堆排序总结 常用接口介绍 PriorityQueue的性质 PriorityQueue默认都是小根堆 public class Test {public static void main(String[] args) {PriorityQue…

基于frp工具实现内网穿透,跨局域网远程SSH登录

文章目录 一.概述1.1 为什么要内网穿透&#xff1f;1.2 什么是frp&#xff1f; 二.frp安装管理流程2.1 frp下载2.2 部署2.3 通过systemd系统服务管理启动程序 三.frp配置测试&#xff08;通过SSH访问内网机器C&#xff09;3.1 服务端配置文件frps.toml修改3.2 客户端配置文件fr…

云计算应用管理----TCP/IP协议及配置、IP地址、子网掩码、网关地址、DNS与DHCP介绍

管理员必备技能: 一、云计算的介绍 什么是服务器 •能够为其他计算机提供服务的更高级的电脑 –机架式 –塔式 –机柜式 –刀片式 典型服务模式 •C/S&#xff0c;Client/Server架构 –由服务器提供资源或某种功能 –客户机使用资源或功能 二、TCP/IP协议及配置 •…

tcp/ip分层模型

文章目录 tcp/ip分层模型封装和分用 tcp/ip分层模型 上面这个图主要介绍了osi七层模型和tcp/ip五层模型&#xff08;有的资料上说的是tcp/ip四层模型&#xff0c;把物理层算在了硬件设备上&#xff0c;这篇文章还是按照五层模型来讲&#xff09;。但osi七层模型实现起来比较复杂…

SQL 关键字参考手册(三)

目录 SQL 关键字 SQL INSERT INTO 关键字 INSERT INTO SQL INSERT INTO SELECT 关键字 INSERT INTO SELECT SQL IS NULL 关键字 IS NULL SQL IS NOT NULL 关键字 IS NOT NULL SQL JOIN 关键字 INNER JOIN LEFT JOIN RIGHT JOIN FULL OUTER JOIN SQL LIKE 关键字…

代码随想录算法训练营第16天 | 104.二叉树的最大深度, 111.二叉树的最小深度 ,222.完全二叉树的节点个数

二叉树理论基础&#xff1a; https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE 104.二叉树的最大深度 题目链接&#xff1a;https://leetcode.cn/problems/maximum-depth-…

【TCP】传输控制协议

前言 TCP&#xff08;Transmission Control Protocol&#xff09;即传输控制协议&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义&#xff0c;为互联网中的数据通信提供了稳定的传输机制。TCP在不可靠的IP层之上实现了数据传输的可…

如何使用Docker部署导航页工具Dashy并实现任意浏览器远程访问——“cpolar内网穿透”

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

linux-apt 2

文章目录 一、删除包&#xff08;Removing Packages &#xff09;1、apt remove package_name2、apt remove package1 package2 package3 ...3、apt purge package14、apt autoremove&#xff08;没有包名参数&#xff09; 二、查询1、apt search package_name2、apt show pack…

UR20机械臂学习笔记

UR20机械臂学习笔记 UR20机械臂学习笔记一.使用UR系列机器人第三方库二.UR机器人的初始化 1.连接UR机器人2.设置机器人末端法兰&#xff08;tcp&#xff09;3.设置机器人末端负载 三.机器人运动程序 1.机器人移动 (1) MoveJ(2) MoveL(3) MoveP(4) MoveC(5) Translate(6) Stop 2…