P1032 字串变换 字符串BFS
题目描述
已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则):
A_1A1 ->B_1B1
A_2A2 -> B_2B2
规则的含义为:在 AA中的子串 A_1A1 可以变换为B_1B1,A_2A2 可以变换为 B_2B2 …。
例如:AA='abcdabcd'BB='xyzxyz'
变换规则为:
‘abcabc’->‘xuxu’‘udud’->‘yy’‘yy’->‘yzyz’
则此时,AA可以经过一系列的变换变为BB,其变换的过程为:
‘abcdabcd’->‘xudxud’->‘xyxy’->‘xyzxyz’
共进行了33次变换,使得AA变换为BB。
输入输出格式
输入格式:
输入格式如下:
AA BB
A_1A1 B_1B1
A_2A2 B_2B2 |-> 变换规则
... ... /
所有字符串长度的上限为2020。
输出格式:
输出至屏幕。格式如下:
若在1010步(包含1010步)以内能将AA变换为BB,则输出最少的变换步数;否则输出"NO ANSWER!"
输入输出样例
abcd xyz
abc xu
ud y
y yz
3 string.find("string",pos) 从pos开始搜索string 先是用map迭代器来遍历
#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define LL long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define N 1005
string s,ans;
map<string,string>mp;
struct node
{
string str;
int d;
}; void bfs()
{
node u,v;
u.str=s;
u.d=;
queue<node>q;
q.push(u);
while(!q.empty())
{
u=q.front();q.pop();
if(u.str==ans){printf("%d\n",u.d);return ;}
if(u.d>=){printf("NO ANSWER!\n");return ;}
map<string,string>::iterator it;
for(it=mp.begin();it!=mp.end();it++)
{
v=u;
v.d++;
int pos=;
while((pos=v.str.find(it->first,pos))!=v.str.npos )
{
pos+=;
node w=v;
w.str=v.str.substr(,pos-)+it->second+v.str.substr(pos+(it->first.size())-, v.str.size() );
q.push(w);
}
}
}
} int main()
{
cin>>s>>ans;
string a,b;
while(cin>>a>>b)
if(!mp.count(a))mp[a]=b;
bfs();
}
五个点一个WA 一个MLE
先不论那个MLE的 下载了WA的数据
abcdefgh
abcd efgh
efgh
efgh
数据
着实恶心。。
map只能一对一
这题不用map就能过 还方便了不少 不用迭代器
蒟蒻被自己蠢死了 用了一个麻烦还错的方法QAQ
bfs 最下面要写noanser 不然没到十次就结束了bfs岂不是什么都不输出(下载了数据才知道)
还有就是
while(cin>>fi[n]>>se[n])n++;
我一开始写成
while(cin>>fi[n]>>se[n++]);
是错的 虽然我还不知道为啥不行
还有。。注意这个map的用法
这个map真的剪枝了很多 之前那个map属实笨比
sub 好多细节 多看!
#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define LL long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define N 1005
string s,ans;
string fi[N];
string se[N];
int n;
struct node
{
string str;
int d;
};
map<string,int>mp; string judge(string str,int i,int j)
{
if(i+fi[j].size()>str.size())return "";
int len=fi[j].size();
if(str.substr(i,len)==fi[j])
return str.substr(,i)+se[j]+str.substr(i+len,str.size()); return "";
} void bfs()
{
queue<node>q;
node u,v;
u.str=s;
u.d=;
q.push(u);
while(!q.empty())
{
u=q.front();q.pop();
if(u.str==ans){printf("%d\n",u.d);return;}
if(u.d>=){printf("NO ANSWER!\n");return;}
if(mp[u.str])continue;
mp[u.str]=;
u.d+=;
rep(i,,u.str.size()-)
rep(j,,n-)
{
string temp=judge(u.str,i,j);
if(temp!="")
{
v=u;
v.str=temp;
q.push(v);
}
}
}
printf("NO ANSWER!\n");
} int main()
{
cin>>s>>ans;
n=;
while(cin>>fi[n]>>se[n])n++;
bfs();
}
P1032 字串变换 字符串BFS的更多相关文章
- 洛谷 P1032 字串变换 (BFS)
题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL ...
- 洛谷 P1032 [ NOIP 2002 ] 字串变换 —— 字符串+bfs
题目:https://www.luogu.org/problemnew/show/P1032 字符串好复杂...先写了个 dfs ,RE一个点TLE一个点,不知该怎么改了... #include< ...
- 洛谷P1032 字串变换【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1032 题意: 给定一个原字符串和目标字符串,以及几个字符串变换的规则. 问能否根据这几个规则在十步之内把原字 ...
- 「NOIP2002」「Codevs1099」 字串变换(BFS
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知有两个字串 $A$, ...
- 洛谷 P1032 字串变换题解
题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A ...
- 洛谷 P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- [洛谷P1032] 字串变换
洛谷题目链接:字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B ...
- luogu P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- 【搜索】P1032 字串变换
题目描述 已知有两个字串A,B及一组字串变换的规则(至多6个规则): A1 ->B1 A2 -> B2 规则的含义为:在 A中的子串 A1 可以变换为B1,A2 可以变换为 ...
随机推荐
- 无线路由器的web漏洞
1.XSS漏洞 2.CSRF漏洞 这样的攻击方式具体可以由多种形式实现,除了建立欺诈服务器外,还可以使用超链接陷阱.所谓的超链接陷阱,就是指伪造一个可信的链接或者地址,但其实际地址中包含了修改无线路由 ...
- Netty入门(3) - ChannelHandler
ChannelPipeline ChannelHandler实例的列表,用于处理或者截获通道的接收和发送数据,让用户可以在ChannelPipeline中完全控制一个事件以及处理ChannelHand ...
- 2017CCPC秦皇岛 L题One-Dimensional Maze&&ZOJ3992【模拟】
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3992 题意: 走迷宫,一个一维字符串迷宫,由'L'.'R'组成,分别 ...
- Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV
今天在使用JSP,引入<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> ...
- python - 远程主机执行命令练习(socket UDP + subprocess.Popen()) 练习1
环境是windows 环境. server端: import socket import subprocess ss = socket.socket(socket.AF_INET,socket.SOC ...
- jquery开发自定义的插件总结
1.第一种方式,有元素的插件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...
- Linux Samba服务主配文件smb.conf中文详解【转】
转自:https://blog.csdn.net/maotianwang/article/details/52524732 从网上找到描述比较详细的smb.conf中文解释: 服务名:smb 配置目录 ...
- GHOST分区丢失只剩C盘
很多人装系统时会经常会使用GHOST来恢复自己的系统,当WINDOWS系统出现意外时,再用GHOST的“From Image to 分区”来对系统进行恢复,这样就可以省去繁琐耗时的重新安装操作系统的工 ...
- PNG,JPEG,BMP,JIF图片格式详解及其对比
原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...
- eclipse自定义工具栏
设置:1.Window2.Customize Perspective说明:Tool Bar Visibility定义菜单栏,Shortcuts定义右键new菜单