题二 字串变换 (存盘名: NOIPG2)

[问题描述]:

  已知有两个字串 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!"

[输入输出样例]

b.in:

 abcd wyz

 abc xu

 ud y

 y yz

屏幕显示:

 3

【思路】

Bfs。

隐式图的搜索,需要注意的是转移的时候状态u中可能有多处与A$匹配,也就是一个A$可以拓展多个点。

【代码】

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<map>
using namespace std; const int maxn = 1000+10;
struct Node{
string s;
int d;
}; string block[maxn];
map<string,int> X;
string a[7],b[7];
string A,B;
int n=0;
int pos[maxn];
void make_pos(string s,string t) {
pos[0]=1; int lens=s.size(),lent=t.size();
for(int i=0;i<=lens-lent;i++)
if(s.substr(i,lent)==t)
pos[pos[0]++]=i;
} void bfs() {
queue<Node> q;
q.push((Node){A,0});
X[A]=1;
while(!q.empty()) {
Node u=q.front(); q.pop();
if(u.s==B) { cout<<u.d; return ; }
for(int r=0;r<n;r++) {
make_pos(u.s,a[r]);
for(int i=1;i<pos[0];i++) {
string s=u.s;
s.replace(pos[i],a[r].size(),b[r]);
if(!X.count(s) && u.d+1<=10) {
X[s]=1;
q.push((Node){s,u.d+1});
}
}
}
}
cout<<"NO ANSWER!";
} int main() {
ios::sync_with_stdio(false);
freopen("NOIPG2.in","r",stdin);
freopen("NOIPG2.out","w",stdout);
cin>>A>>B;
while(cin>>a[n]>>b[n]) n++;
bfs();
return 0;
}

找出所有字符串匹配点也可以用KMP算法,就本题数据而言优化效果不大

int f[maxn];
void get_Fail(string P) {
int m=P.size();
f[0]=f[1]=0;
for(int i=1;i<m;i++) {
int j=f[i];
while(j && P[j]!=P[i]) j=f[j];
f[i+1]=P[i]==P[j]?j+1:0;
}
}
void KMP(string T,string P) {
pos[0]=1;
int n=T.size(),m=P.size();
get_Fail(P);
int j=0;
for(int i=0;i<n;i++) {
while(j && T[i]!=P[j]) j=f[j];
if(T[i]==P[j]) j++;
if(j==m) pos[pos[0]++]=i-m+1,j=0; //i-m+1
}
}

NOIP2002 字串变换的更多相关文章

  1. NOIP2002 字串变换题解(双向搜索)

    65. [NOIP2002] 字串变换 时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字串A$, B$及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ ...

  2. NOIP2002字串变换[BFS]

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

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

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

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

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

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

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

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

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

  7. 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换

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

  8. 「NOIP2002」「Codevs1099」 字串变换(BFS

    1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 已知有两个字串 $A$, ...

  9. [NOIP2002] 提高组P1032 字串变换

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

随机推荐

  1. Websocket协议之握手连接

    Websocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信的问题而设计的,是完全意义上的Web应用端的双向通信技术,可以取代之前使用半双工HTTP协议而模拟全双工通信,同时克服了带 ...

  2. php开学之环境搭建

    1. php版本选择 1.1 PHP非线程安全与线程安全版本的选择技巧 1.2 版本区别 PHP的大版本主要分三支:PHP4/PHP5/PHP6 其中,PHP4由于太古老.对QQ支持不力已基本被淘汰, ...

  3. windows下常用快捷键

    windows下常用快捷键: 显示桌面: win徽标+D 打开资源管理器: win徽标+E 打开任务管理器: Ctrl+Alt+delete 任务切换: Alt+Tab 应用程序中窗口之间的切换: C ...

  4. 9.MVC框架开发(关于ActionResult的处理)

    1.在Action处理之后,必须有一个返回值,这个返回值必须继承自ActionResult的对象 2.ActionResult,实际就是服务器端响应给客户端的结果 ViewResult(返回视图结果) ...

  5. 《javascript高级程序设计》对象图

    1.原型链图 2.作用域链图 3.继承

  6. jquery script

    http://tech.it168.com/a2012/0206/1307/000001307783_all.shtml http://blog.csdn.net/lyatzhongkong/arti ...

  7. 对 APM 用户的一次真实调查分析(上)

    一.前言 国内的 APM 行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的 APM 企业,例如,OneAPM,APPdynamic,Dynami ...

  8. .NET事件的指导原则

    C#允许编写所需的各种类型的事件.但是,为了与.NET Framwork的组件相兼容,开发人员必须遵循微软为此建立的一系列指导原则.这些指导原则的核心是,事件处理程序必须拥有两个参数.第一个参数是一个 ...

  9. [Unity菜鸟] Mecanim 系统遇到的问题

    1. 给角色添加一个Animator组件和New State,运行后,摆出这种奇怪的姿势 这是因为没有把动画片段赋给New State,可以看到此时的New State为空,把Idle片段拖进去就好了 ...

  10. SPRING IN ACTION 第4版笔记-第六章RENDERING WEB VIEWS-006- 使用thymeleaf(TemplateResolver、SpringTemplateEngine、ThymeleafViewResolver、th:include、th:object、th:field="*{firstName}")

    一.在Spring中使用thymeleaf的步骤 1.配置 In order to use Thymeleaf with Spring, you’ll need to configure three ...