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 可以变换为 ...
随机推荐
- MySQL锁解决并发问题详解
文章分为以下几个要点 问题描述以及解决过程 MySQL锁机制 数据库加锁分析 下面讨论的都是基于MySQL的InnoDB. 0. 问题描述以及解决过程 因为涉及到公司利益问题,所以下面很多代码和数据库 ...
- 第二节--Servlet
1.在tomcat的webapp下新建一个web项目test 要有WEB-INF目录,其下有web.xml. 2.WEB-INF下文件是给tomcat使用的 3.用户访问localhost:848 ...
- Java基础编程题——水仙花数
package com.yangzl.basic; /** * 题目:打印出所有的"水仙花数". * 所谓"水仙花数"是指一个三位数, * 其各位数字立方和等于 ...
- DPM 目标检测1
1. Origin 原始目标检测: HOG梯度模型+目标匹配 为了提过对目标形变的鲁棒性(多视角->多组件): 目标形态多样性—>多个模型 目标的动态变化多视角—> 子模型 目标形变 ...
- pyqt5-多线程QThread类
要实现多线程,我们要先继承QThread类并重新实现其中的run()函数,也就是说把耗时的操作放入run()函数中 import sys from PyQt5.QtCore import Qt, QT ...
- mysql 案例 ~ pt校验工具介绍
简介:今天咱们来聊聊PT校验工具pt-table-checksum 注意事项: 1. 根据测试,需要一个即能登录主库,也能登录从库的账号: 2. 只能指定一个host,必须为主库的IP: ...
- ResNet152网络复现(Caffe)
一.准备数据集 1) 下载数据集 Imagnet网站上下载了三类图片,分别是big cat.dog.fish,其中训练集的图片数一共是4149,测试集的图片数是1003,训练集和测试集的图片数比例4 ...
- Struts通配符映射
- oracle建包,函数demo
create table BOOK ( BOOK_ID NUMBER(10), BOOK_NAME VARCHAR2(10) ); create or replace package chen_pac ...
- 编码器AE & VAE
学习总结于国立台湾大学 :李宏毅老师 自编码器 AE (Auto-encoder) & 变分自动编码器VAE(Variational Auto-encoder) ...