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 可以变换为 ...
随机推荐
- Zabbix 监控服务
熟悉了解一些 zabbix 基础项目监控 zabbix_get 相关操作 :获取 item 监控数据 基本格式: -s --host: 指定客户端主机名或者IP -p --port:客户端端口,默认 ...
- 绘图QPainter-画刷
Qt提供的画刷风格: Qt.TexturePattern 自定义图像画刷 线性渐变 QLinearGradientPattern QLinearGradient需要传入的参数为需要进行渐变的区域坐 ...
- Python3之网络爬虫<0>初级
由于Python3合并URLib与URLlib2统一为URLlib,Python3将urlopen方法放在了urllib.request对象下. 官方文档:https://docs.python.or ...
- 最新Linux系统Ubuntu16.04搭建HUSTOJ(LAMP环境)
应该跟着下面的步骤就OK了吧! 1.升级软件库,更新软件 打开终端 输入 sudo apt-get update sudo apt-get upgrade 2.安装mysql5.7 (注意:mysql ...
- POJ2031 Building a Space Station【最小生成树】
题意: 就是给出三维坐标系上的一些球的球心坐标和其半径,搭建通路,使得他们能够相互连通.如果两个球有重叠的部分则算为已连通,无需再搭桥.求搭建通路的最小边长总和是多少. 思路: 先处理空间点之间的距离 ...
- Javascript定义变量
在JavaScript中通过var来定义变量,不管是数字还是字符串,都可以通过这种方式来定义:我们既可以在声明变量的同时给变量赋值,也可以先声明变量,再给变量赋值. <script> va ...
- 在css中控制图像的大小
可在CSS中利用width属性和height属性控制一个图像得到大小,就像控制其他任何盒子的大小一样. <html> <head> <title>TODO supp ...
- Java用System读取系统相关信息、环境变量——(六)
package Java_Test; public class System1 { public static void main(String[] args) { // TODO Auto-gene ...
- SpringBoot集成Spring Security(授权与认证)
⒈添加starter依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifact ...
- Mac下的开发工具
1.webstrom 淘宝上2块钱就能买一个 WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为“Web前端开发神器”.“最强大的HTML5编辑 ...