P1032
写这道不算难的题目是我遇到了不少问题,复述以下过程吧。
由于数据很水,这道题用不到KMP算法,只要使用朴素算法进行字符串比对就可以了。
1
首先,我错误的选择了dfs算法,导致了TLE的发生。这类求最优解的问题显然大多应该用bfs解决,可是改用bfs后依然不对。
2
过了一天,我我发现自己忘了考虑如果一个字符串多处都可以用同一规则替换,那么各处替换都应该考虑到的这一问题。最开始我都是只替换第一处的。后来意识到这一问题是我刚开始觉得如果每一处都有换和不换两种情况且有n处可换的话,我岂不是应该把2的n次方个元素插入队列?这样实现起来好麻烦,又不如深搜了。后来我意识到我并不需要插入2
的n次方个元素,我只需要插入n个就可以了,即分别是“第一处改其他都不改”、“第二处改其他都不改”、...、等等。因为那种”“第xy处改”的情况其实当只有第x处改的那个入队的元素出队的时候自然会考虑到,所以并不需要现在考虑那个问题。于是我解决了这一问题再然后,我发现依然TLE了,观看题解发现bfs竟然也要排重才可以,否则哪怕是bfs算法,不排重也会算的贼慢。排重自然是想到用了map,然而,使用map后五个点中有两个点RE,剩下三个点AC。我在本地ide中测试发现终端输出libc++abi: terminating due to uncaught exception of type std::out_of_range: basic_string,意思是抛出了一个out_of_range异常。我把map有关的查重代码注释掉之后就不在异常了,说明是查重代码if (m.find(tstr.s) != m.end()) {continue;}m[tstr.s]=1;导致了out_of_range异常的抛出,可我不理解为何如此已经该怎么修
3
过了一天,我出去玩了,又过了一天,我重新开始想这道题,我发现事实并非如我昨天想的那样,删除map有关代码就不再报错并不一定是因为map抛出了异常
,还有可能是map导致的代码执行的变化致使其他函数抛出了异常,自己之前的那个把罪直接定在map上的想法实在是太绝对了。事实上,是string抛出了异常,原因也很简单,我访问了越界的数据。在strf::can这个“判断s能否使用Vi规则进行替换”的函数时忘了Vi(a->b)规则的a有可能比s还长。我先入为主的认为了s应该是一个长串,导致了没想到这个问题。后来我使用输出中间变量的办法好久也没发现问题所在,直到用调试模式开始逐步调试的时候才发现了问题所在,然后加入了一行简单的判断代码就解决了这个问题。
教训
1、要慎重选用bfs还是dfs,最优解问题应该选用dfs,涉及输入过程的bfs和dfs都可以做到过程输出,更应该看需要输出一个过程还是所有过程,从而判断是bfs还是dfs。
2、别舍不得排重用到的空间,很多时候排重能带来很大的时间优化。
3、不能武断的判断抛出异常的对象。
4、涉及字符串和数组的每个部分都一定要考虑好是否越界。
5、应当更习惯使用调试程序来排错而非输出中间数据来排错。
最终代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <stack>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
using namespace std;
struct strf
{
string a,b;
strf(string x,string y){a=x;b=y;}
int can(string s,int pass)
{
if(s.length()<a.length()) return -1;
for(int i=0;i<=s.length()-a.length();i++)
{
int flag=1;
for(int j=i;j<=i+a.length()-1;j++)
{
if(s[j]!=a[j-i])
{
flag=0;
break;
}
}
if(flag==1)
{
if(pass==0)
return i;
else
pass--;
}
}
return -1;
}
string doit(string s,int pos)
{
string tail=s.substr(pos+a.length());
s.erase(pos,s.length()-pos); s+=b; s+=tail;
return s;
}
};
struct str{string s;int step;str(string S,int Step){s=S;step=Step;}};
vector<strf> V;//其实可以换成链表来存储,在这个特定需求下,很适合用链表
string A,B,s1,s2;
queue<str> q;
map<string,int> m;
int main()
{
cin>>A>>B;
while(cin>>s1>>s2)
V.push_back(strf(s1,s2));
q.push(str(A,0));
while(!q.empty())
{
str tstr(q.front()); q.pop();
if(tstr.step>10)break;
if(tstr.s==B){cout<<tstr.step<<endl;return 0;}
if (m.find(tstr.s) != m.end()) {continue;} m[tstr.s]=1;
for(int i=0;i<V.size();i++)
for(int pass=0;V[i].can(tstr.s,pass)!=-1;pass++)
q.push(str(V[i].doit(tstr.s,V[i].can(tstr.s,pass)),tstr.step+1));
}
cout<<"NO ANSWER!"<<endl;
return 0;
}
P1032的更多相关文章
- 洛谷 P1032 子串变换
题目链接 https://www.luogu.org/problemnew/show/P1032 本题是一道bfs问题,从a串开始,每一步完成替换一对字符串(但是一个一步替换可以将这对字符串替换好几次 ...
- 洛谷P1032 字串变换【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1032 题意: 给定一个原字符串和目标字符串,以及几个字符串变换的规则. 问能否根据这几个规则在十步之内把原字 ...
- 【题解】洛谷P1032 [NOIP2002TG]字串变换(BFS+字符串)
洛谷P1032:https://www.luogu.org/problemnew/show/P1032 思路 初看题目觉得挺简单的一道题 但是仔细想了一下发现实现代码挺麻烦的 而且2002年的毒瘤输入 ...
- 洛谷 P1032 [ NOIP 2002 ] 字串变换 —— 字符串+bfs
题目:https://www.luogu.org/problemnew/show/P1032 字符串好复杂...先写了个 dfs ,RE一个点TLE一个点,不知该怎么改了... #include< ...
- 洛谷 P1032 字符变换
洛谷 P1032 字符变换 题目描述 已知有两个字串 A,B 及一组字串变换的规则(至多 6 个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A 中的子串 A1 ...
- 洛谷 P1032 字串变换题解
题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A ...
- 【洛谷】P1032 字串变换
题目地址:https://www.luogu.org/problemnew/show/P1032 洛谷训练场BFS的训练题呀. “BFS不就是用队列的思想去遍历一切情况嘛.我已经不是小孩子了,我肯定能 ...
- luogu题解P1032字串变换--BFS+STL:string骚操作
题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...
- TYVJ P1032 零用钱 Label:贪心
背景 USACO OCT09 7TH 描述 作為创造產奶纪录的回报,Farmer John决定开始每个星期给Bessie一点零花钱. FJ有一些硬币,一共有N (1 <= N <= 20) ...
- P1032 字串变换
最近在练习bfs,看到了02年提高组的这个题,顿时来了兴致,联想到前一阵子的八数码问题,具体就是使用一个字符串来存储状态,把他存储到一个图中,然后开始bfs,如果10步之内无法完成就剪枝,同时使用哈希 ...
随机推荐
- [ABC309Ex] Simple Path Counting Problem
Problem Statement We have a grid with $N$ rows and $M$ columns. We denote by $(i,j)$ the cell in the ...
- STM32CubeMX教程5 TIM 定时器概述及基本定时器
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 逻 ...
- C语言之小明的加减法
1.题目内容: 叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如: 小明会把1234它看成4321:把-1234看成-4321:把230看成032 (032=32):把-230看成-0 ...
- 0X01 位运算笔记
位运算,经常可以用来处理一些数学或动归方面的问题,通常会在数据范围较小的情况下使用. 为方便起见,一个 \(\mathrm{n}\) 位二进制数从右到左分别为第 \(\mathrm{0 \sim n ...
- 云小课|MRS基础原理之ClickHouse组件介绍
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:在2016年开源的 ...
- 如何给网页和代码做HTML加密?
如何给网页和代码做HTML加密? 本篇文章给大家谈谈html混淆加密在线,以及HTML在线加密对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔. 如何给代码加密? 1.源代码加密软件推荐使 ...
- ipa文件怎么安装到iPhone手机上?
ipa文件怎么安装到iPhone手机上? 无需越狱帮你把ipa文件安装到苹果手机上 E86苹果签名简介:点击可查看 很多人都知道apk文件是安卓的app应用程序文件名,但有人知道苹果ios的app ...
- 线下Meetup:在数智化转型背景下,火山引擎VeDI的大数据技术揭秘
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,联合火山引擎开发者社区,火山引擎数智平台(VeDI)<数智化转型背景下的火山引擎大数据技术揭秘& ...
- Solon 拉取 maven 包很慢或拉不了,怎么办?
注意:如果在 IDEA 设置里指定了 settings.xml,下面两个方案可能会失效.(或者直接拿"腾讯" 的镜像仓库地址,按自己的习惯配置) 1.可以在项目的 pom.xml ...
- SpringBoot java 一个接口,多个实现,客户定制化
产品定制化时,在不同的客户中会有不同的需求,这时候会产生,一个接口,多个实现 SpringBoot ,如果发现有多实现时,会报如下错误 Consider marking one of the bean ...