NOIP2002 字串变换题解(双向搜索)
65. [NOIP2002] 字串变换
时间限制:1 s 内存限制:128 MB
[问题描述]
已知有两个字串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!"
[输入样例]
abcd xyz
abc xu
ud y
y yz
[输出样例]
3
在这里膜拜一下wq大佬,强行bfs藐视数据,我就比较惨了,打了好几次,正着搜反着搜都会T某个点,这就比较尴尬了,于是乎,我们引进了双向搜索这个概念。
我们可以把宽搜想像为一棵树,为了方便计算,我们暂定它为二叉树好了,如果我要搜10层,我单项搜索,会有2047个节点,但如果我双向搜索,就只有63+63==126个节点了,由此可见,双向可以说是完爆单向的,何况这只是二叉树。
于是这道题在双向搜索的前提下就无比简单了,我们把A,B分别塞进两个队列,同时广搜,直到两者相遇。至于修改操作吗,string就可以搞定了。
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<string>
#include<cmath>
using namespace std;
string a,b;
string A[],B[];
struct st{
string x;
int js;
};
int js;
queue<st> q1;
bool yx;
int p=,q=;
unsigned long long xp[];
int fw[][];
bool get_hash(st x,int be){
unsigned long long has=;
for(int i=x.x.length()-;i>=;i--)
{
has=has*p+int(x.x[i]);
}
has%=q;
if(fw[be][has])
return ;
fw[be][has]=x.js;
if(fw[be^][has])
{
printf("%d\n",x.js+fw[be^][has]);
exit();
}
return ;
}
queue<st> q2;
void bfs(){
while(!q1.empty()&&!q2.empty())
{
st aa=q1.front();
q1.pop();
if(aa.js>)
{
yx=;
printf("NO ANSWER!\n");
return;
}
for(int i=;i<=js;i++)
{
int la=-;
for(int j=;j<=aa.x.length();j++)
{
long long t=aa.x.find(A[i],j);
if(t>=&&t<=&&t!=la)
{
la=t;
j=la-;
st c;
c.x=aa.x;
c.x.replace(t,A[i].length(),B[i]);
c.js=aa.js+;
if(c.x.length()<=&&!get_hash(c,)&&c.js<=)
{
q1.push(c);
}
}
}
}
st bb=q2.front();
q2.pop();
if(bb.js>)
{
yx=;
printf("NO ANSWER!\n");
return;
}
for(int i=;i<=js;i++)
{
int la=-;
for(int j=;j<=bb.x.length();j++)
{
long long t=bb.x.find(B[i],j);
if(t>=&&t<=&&t!=la)
{
la=t;
j=la-;
st c;
c.x=bb.x;
c.x.replace(t,B[i].length(),A[i]);
c.js=bb.js+;
if(c.x.length()<=&&!get_hash(c,)&&c.js<=)
{
q2.push(c);
}
}
}
}
}
}
int main(){
cin>>a>>b;
js=;
while(cin>>A[js]>>B[js])
{
js++;
}
js--;
st xx;
xx.x=a;
xx.js=;
q1.push(xx);
get_hash(xx,);
st yy;
yy.x=b;
yy.js=;
q2.push(yy);
get_hash(yy,);
xp[]=;
for(int i=;i<=;i++)
{
xp[i]=xp[i-]*p;
}
bfs();
if(!yx)
printf("NO ANSWER!\n");
//while(1);
return ;
}
NOIP2002 字串变换题解(双向搜索)的更多相关文章
- 双向BFS—>NOIP2002 字串变换
如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...
- 洛谷 P1032 字串变换题解
题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A ...
- NOIP2002字串变换[BFS]
题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2 ...
- NOIP2002 字串变换
题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...
- [NOIP2002]字串变换 T2 双向BFS
题目描述 已知有两个字串 A,B 及一组字串变换的规则(至多6个规则): A1−>B1 A2−>B2 规则的含义为:在 A$中的子串 A1可以变换为可以变换为B1.A2可以变换为可 ...
- 洛谷 P1032 字串变换 题解
每日一题 day19 打卡 Analysis 广搜+map判重 用find寻找字串,再用replace替换字串 这里的map相当于正常广搜的一个book的作用 #include<iostream ...
- [NOIP2002] 字串变换 宽搜+深度优化
这道题硬是让我用STL水过.......而且题解里说的什么双向宽搜,交替扩展............... 这道题反正,STL用就用吧,但是状态数可以卡到千亿级别,因为这个东西是阶乘扩展的,然后我们发 ...
- 洛谷P1032 字串变换-题解
https://www.luogu.org/problemnew/show/P1032--(题目传送) 好在数据范围很小,暴力一点也能过.思路较简单,按照所有规则,从第一位开始广搜. 注意:1.str ...
- [COGS 0065][NOIP 2002] 字串变换
65. [NOIP2002] 字串变换 ★★ 输入文件:string.in 输出文件:string.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 已知有两个字 ...
随机推荐
- qmake 时复制文件(自动在编译前做一些操作,且写在.pro文件里)
有时在编译前需要准备一些文件,例如修改了 QtCreator 的编译输出目录: Build & Run > Default build directory,使用 Promote 后需要在 ...
- HTTP请求(GET与POST区别)和响应(get是从服务器上获取数据,post是向服务器传送数据,格式与举例都非常清楚)
HTTP有两部分组成:请求与响应,下面分别整理. 一.HTTP请求 1.HTTP请求格式: <request line> <headers> <blank line> ...
- 核心思想:许多公司都没有认识到云储存的革命性(类似QQ把它搞成了用户的家、再也离不开了)
在云储存刚刚兴起的时候,也就是dropbox刚刚进入大家视野的时候.许多人都是简单的认为这只是一个提供在线存储的服务而已,许多公司都没有认识到云储存的革命性. 对于这些大公司贸然进入一些新的领域是需要 ...
- asp.net 验证正则表达式 精心整理
asp.net 验证正则表达式 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$& ...
- 企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) 译(2)
本书包含的章节内容 第一章:表现模式,以一个例子呈献给读者表现模式的发展历程,我们会用包括MVC和MVP在内的各种方式实现一个收费项目的例子.沿此方向,我们会发现每一种模式的问题所在,这也是触发设计模 ...
- LINQ学习笔记(三)
下面对各子句解释 from子句:查询表达式的开始子句,查询表达式必须以from子句开头. 格式:from u in source 其中u表示范围变量,它表示源序列中的每个后续元素,source为数据源 ...
- WIFI Manager
Vistumbler - wifi managerhttps://www.vistumbler.net/downloads.htmlhttps://github.com/RIEI
- 轻量级 Material Design 前端框架 MDUI (纯html,css,与css框架跟react vue不冲突)
MDUI 是一个轻量级的 Material Design 前端框架,对照着 Material Design 文档进行开发,争取 1:1 实现 Material Design 中的组件. 多主题支持 M ...
- Servlet 3.0异步特性初探
Servlet 是 Java 为了编写服务端程序而定义的一个接口规范,在 Servlet 3.0 以后支持了异步的操作. 最近项目添加了一个代码热部署的功能,在客户端输入信号,信号到达 Web 服务器 ...
- 基于STM32F429和Cube的主从定时器多通道输出固定个数的PWM波形
主从定时器的原理已在上篇博文: 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序 讲解了,这篇重点就讲如何实现多通道的PWM级联输出. 1.软件环境 Keil5 ...