NOIP2002 字串变换
题二 字串变换 (存盘名: 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 字串变换的更多相关文章
- NOIP2002 字串变换题解(双向搜索)
65. [NOIP2002] 字串变换 时间限制:1 s 内存限制:128 MB [问题描述] 已知有两个字串A$, B$及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ ...
- NOIP2002字串变换[BFS]
题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2 ...
- [NOIP2002]字串变换 T2 双向BFS
题目描述 已知有两个字串 A,B 及一组字串变换的规则(至多6个规则): A1−>B1 A2−>B2 规则的含义为:在 A$中的子串 A1可以变换为可以变换为B1.A2可以变换为可 ...
- 双向BFS—>NOIP2002 字串变换
如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...
- [NOIP2002] 字串变换 宽搜+深度优化
这道题硬是让我用STL水过.......而且题解里说的什么双向宽搜,交替扩展............... 这道题反正,STL用就用吧,但是状态数可以卡到千亿级别,因为这个东西是阶乘扩展的,然后我们发 ...
- [COGS 0065][NOIP 2002] 字串变换
65. [NOIP2002] 字串变换 ★★ 输入文件:string.in 输出文件:string.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 已知有两个字 ...
- 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换
###题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换 ...
- 「NOIP2002」「Codevs1099」 字串变换(BFS
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知有两个字串 $A$, ...
- [NOIP2002] 提高组P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
随机推荐
- ORA-12012 error on auto execute of job 8887
*** ACTION NAME:(AUTO_SPACE_ADVISOR_JOB) -- ::58.046 *** MODULE NAME:(DBMS_SCHEDULER) -- ::58.046 ** ...
- 一次Oracle数据迁移
目标数据库:Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 源数据库 : Oracle Database 11g Enterpri ...
- ora_reco_070361 hs message to agent event 等待事件
现象描述:oracle通过透明网关查询Teradata数据库的表突然变得很慢,小表可以查询出来,大表干脆就出不来. 分析过程: 1.网络可以ping通,小表可以过来,说明网络和网关都没有什么问题的. ...
- 第四章 Web表单
4.1 跨站请求伪造保护 安装flask-wtf app = Flask(__name__) app.config['SECRET_KEY'] = 'hard to guess string' 密钥不 ...
- 使用memcache(thinkphp框架学习)
$memcache = new Memcache; $memcache->connect("localhost",11211); $memcache->set('sxt ...
- C# - 非中断(正常)模式下的调试
一般我们用Console.WriteLine()函数,将文本输出到控制台上来跟踪代码进行到了什么位置,局限性很大,适用范围窄. 1. 输出调试信息 命名空间 System.Dignostics Deb ...
- ms-grid layout
<!DOCTYPE html> <html> <head> <title></title> <script src="js/ ...
- Microsoft Visual Studio 2010 Service Pack 1(exe)
在线安装包:https://cid-3ca83445bd7767a0.office.live.com/browse.aspx/.Public/VS2010 ISO:http://download.mi ...
- java.util.ArrayList
/* * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...
- 百度:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序
一.题目理解 题目:数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序.要求空间复杂度为O ...