洛谷 P1032 字串变换

2024-01-26 17:28
文章标签 洛谷 变换 字串 p1032

本文主要是介绍洛谷 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;
}

这篇关于洛谷 P1032 字串变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/647517

相关文章

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

【数字信号处理】一文讲清FFT(快速傅里叶变换)

目录 快速傅里叶变换(Fast Fourier Transform,FFT)FFT的背景快速傅里叶变换(Fast Fourier Transform,FFT)DFT的数学表达实际计算重要性和应用频谱泄露、频谱混叠奈奎斯特采样定理参考链接 快速傅里叶变换(Fast Fourier Transform,FFT) FFT的背景 1、为什么要时域→频域频率?50Hz+频率120Hz

每日一练:无重复字符的最长字串

一、题目要求 给定一个字符串 s ,请你找出其中不含有重复字符的 最长  子串  的长度。 示例 1: 输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: s = "

傅里叶变换家族

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

齐次变换矩阵的原理与应用

齐次变换矩阵的原理与应用 通过齐次变换矩阵,可以描述机械臂末端执行器(法兰)在三维空间中的平移和旋转操作。该矩阵结合了旋转和平移信息,用于坐标变换。 1. 齐次变换矩阵的基本形式 一个齐次变换矩阵 T是一个 4x4 矩阵,表示刚体的旋转和平移: T = [ R t 0 1 ] = [ r 11 r 12 r 13 x r 21 r 22 r 23 y r 31 r 32 r 33 z 0

MATLAB分析图像的离散余弦变换(DCT)

1. MATLAB的介绍以及所需函数的说明:  1.1 MATLAB  MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks 公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设