牛客:[NOIP2002]字串变换(双向bfs)

server/2024/10/11 0:29:03/

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

已知有两个字串 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’
共进行了三次变换,使得A变换为B。

输入描述:

 

输入格式如下:

A B

A1 B1 \

A2 B2  |-> 变换规则

... ... /

所有字符串长度的上限为 20。

输出描述:

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

示例1

输入

复制abcd xyz abc xu ud y y yz

abcd xyz
abc xu
ud y
y yz

输出

复制3

3

做法

#include<bits/stdc++.h>
using namespace std;
string s,t,a[10],b[10];
int n;
queue<string> q1,q2;
unordered_map<string,int> mp1,mp2;
int bfs(){int step=0;q1.push(s);q2.push(t);mp1[s]=0;mp2[t]=0;while(++step<=5){ while(mp1[q1.front()]==step-1){//上一层的string tmp=q1.front();q1.pop();for(int i=0;i<n;i++){int pos=0;while(pos<tmp.size()){string ss=tmp;if(ss.find(a[i],pos)==-1) break;//子串没有包含a[i]ss.replace(ss.find(a[i],pos),a[i].size(),b[i]);//注意起始点if(mp1.find(ss)!=mp1.end()) {pos++;continue;//搜过了}if(mp2.find(ss)!=mp2.end()) return step*2-1;//会合,当前这步不算q1.push(ss);mp1[ss]=step;pos++;}}}while(mp2[q2.front()]==step-1){string tmp=q2.front();q2.pop();for(int i=0;i<n;i++){int pos=0;while(pos<tmp.size()){string ss=tmp;if(ss.find(b[i],pos)==-1) break;ss.replace(ss.find(b[i],pos),b[i].size(),a[i]);if(mp2.find(ss)!=mp2.end()) {pos++;continue;//搜过了}if(mp1.find(ss)!=mp1.end()) return step*2;mp2[ss]=step;q2.push(ss);pos++;}}}}return -1;
}
int main(){cin>>s>>t;while(cin>>a[n]>>b[n]) n++;int ans=bfs();if(ans==-1) cout<<"NO ANSWER!";else cout<<ans;
}


http://www.ppmy.cn/server/129867.html

相关文章

详解RTL design的 CDC和RDC

一、CDC(跨时钟域处理,Clock Domain Crossing) (一)基本原理 时钟域的概念 在芯片设计中,时钟域是由一个时钟信号及其相关逻辑组成的区域。每个时钟域内的电路元件(如寄存器、组合逻辑等)都由同一个时钟信号来同步操作。例如,一个微处理器芯片可能有多个时钟域,如用…

图文深入理解Oracle DB Scheduler

值此国庆佳节&#xff0c;深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。今天继续宅继续写。本篇图文深入介绍Oracle DB Scheduler。 Oracle为什么要使Scheduler&#xff1f; 答案就是6个字&#xff1a;简化管理任务。 • Scheduler&#xff08;调度程序&#x…

Leetcode 10. 正则表达式匹配

1.题目基本信息 1.1.题目描述 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s 的&#xff0c;而不是部分…

ElementUI 2.x 输入框回车后在调用接口进行远程搜索功能

输入框回车后在调用接口进行远程搜索功能 主要思路 默认的远程搜索会在输入框聚焦的时候就展示下拉弹窗&#xff0c;而我们需要的是在回车之后才展示下拉弹窗。 具体代码 <divv-for"(domain, index) in formData.domains"class"dynamic-input":key&…

【笔记】微分方程

一、微分方程的基本概念: 定义: 微分方程是一个包含未知函数及其一个或多个导数的方程。 阶: 微分方程的阶是指方程中出现的最高阶导数。 线性与非线性: 如果未知函数及其导数都是一次方的,则称为线性微分方程;否则为非线性微分方程。 常微分方程(ODE)与偏微分方程(PDE): 常…

k8s 中存储之 PV 持久卷 与 PVC 持久卷申请

目录 1 PV 与 PVC 介绍 1.1 PersistentVolume&#xff08;持久卷&#xff0c;简称PV&#xff09; 1.2 PersistentVolumeClaim&#xff08;持久卷声明&#xff0c;简称PVC&#xff09; 1.3 使用了PV和PVC之后&#xff0c;工作可以得到进一步的细分&#xff1a; 2 持久卷实验配置…

VAS1800Q奇力科技线性芯片电荷泵热处理

高效恒流LED驱动器——VAS1800Q在汽车应用中的卓越表现 VAS1800Q是一款专为汽车应用设计的高效恒流LED驱动器。它具备多个显著特点&#xff0c;不仅提升了LED驱动效率&#xff0c;还大大减少了热量的产生&#xff0c;使其在汽车照明领域中具有极高的应用价值。本文将详细介绍VA…

QT学习笔记3.1(建立项目、执行_建立第一个工程)

QT学习笔记3.1&#xff08;建立项目、执行_建立第一个工程) 建立第一个工程&#xff0c;使用widget模板 使用的版本是 Qt Creator 4.11.0 Based on Qt 5.14.0 (MSVC 2017, 32 bit) 1.选择Application-》QT Widget Application&#xff08;最常使用&#xff09; 2.项目保存位…