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 字串变换题解(双向搜索)的更多相关文章

  1. 双向BFS—>NOIP2002 字串变换

    如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...

  2. 洛谷 P1032 字串变换题解

    题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A ...

  3. NOIP2002字串变换[BFS]

    题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2 ...

  4. NOIP2002 字串变换

    题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...

  5. [NOIP2002]字串变换 T2 双向BFS

    题目描述 已知有两个字串  A,B  及一组字串变换的规则(至多6个规则): A1−>B1 A2−>B2 规则的含义为:在  A$中的子串  A1可以变换为可以变换为B1.A2可以变换为可 ...

  6. 洛谷 P1032 字串变换 题解

    每日一题 day19 打卡 Analysis 广搜+map判重 用find寻找字串,再用replace替换字串 这里的map相当于正常广搜的一个book的作用 #include<iostream ...

  7. [NOIP2002] 字串变换 宽搜+深度优化

    这道题硬是让我用STL水过.......而且题解里说的什么双向宽搜,交替扩展............... 这道题反正,STL用就用吧,但是状态数可以卡到千亿级别,因为这个东西是阶乘扩展的,然后我们发 ...

  8. 洛谷P1032 字串变换-题解

    https://www.luogu.org/problemnew/show/P1032--(题目传送) 好在数据范围很小,暴力一点也能过.思路较简单,按照所有规则,从第一位开始广搜. 注意:1.str ...

  9. [COGS 0065][NOIP 2002] 字串变换

    65. [NOIP2002] 字串变换 ★★   输入文件:string.in   输出文件:string.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字 ...

随机推荐

  1. 【Python】设备重启测试

    ①添加读取键盘输入功能,方便测试者选择压测次数! Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘. input 可以接收一个Python表达式作为输入,并将运 ...

  2. 【python】python调用adb

    本期分享下python如何调用adb: 1.导入os模块 import os 2.python中调用adb命令语法 print("显示机型信息:") os.system('adb ...

  3. 改善C#程序的建议8:避免锁定不恰当的同步对象

    原文:改善C#程序的建议8:避免锁定不恰当的同步对象 在C#中让线程同步的另一种编码方式就是使用线程锁.所谓线程锁,就是锁住一个资源,使得应用程序只能在此刻有一个线程访问该资源.可以用下面这句不是那么 ...

  4. Caliburn.Micro 自定义View和ViewModel的匹配规则

    使用TypeMappingConfiguration类 //Override the default subnamespaces var config = new TypeMappingConfigu ...

  5. Office Add-In 应用类型及平台支持

    原文地址: http://simpeng.net/office-add-in/office-add-in-%e5%ba%94%e7%94%a8%e7%b1%bb%e5%9e%8b%e5%8f%8a%e ...

  6. Qt发展历史及其特点简介(没有哪一种方案能够独霸Windows)

    Qt 是一个跨平台的C++应用程序框架,支持Windows.Linux.Mac OS X.Android.iOS.Windows Phone.嵌入式系统等.也就是说,Qt 可以同时支持桌面应用程序开发 ...

  7. 设计模式——(Abstract Factory)抽象工厂“改正为简单工厂”

    设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难.你必须设计相关类,并设计类的接口和继承之间的关系.设计必须可以解决当前问题,同时必须对将来可能发生的问题和需求也有足够的针对性.掌握面向 ...

  8. SYN4104型 数字网同步时钟

    SYN4104型 数字网同步时钟 产品概述 SYN4104型数字网同步时钟是由西安同步电子科技有限公司精心设计.自行研发生产的一款高精度锁相时钟频率源,接收GPS信号,使恒温晶振输出频率同步于GPS卫 ...

  9. Python socket文件上传下载

    python网络编程 程序的目录结构 socketDemo ├── client │   ├── cli.py │   └── local_dir │   └── lianxijiangjie.mp4 ...

  10. 解决npm install卡住不动的小尴尬

    npm install卡顿问题记录 遇到的问题 npm install -g @angular/cli 安装angular cli工具时,发现进度条一直卡住不动,相信很多朋友也遇到过.原因应该是国内的 ...