大暴搜 字串变换

洛谷P1032 [NOIP 2002 提高组] 字串变换 这是一个字符串变换的搜索问题,我们可以使用广度优先搜索(BFS)来解决。BFS 可以保证找到的路径是最短的,这符合题目要求输出最少变换步数的条件。测试数据非常的水,各种做法都可以通过,不代表算法正确。规则的含义为:在 A 中的子串 A1​ 可以变换为 B1​,A2​ 可以变换为 B2​⋯。若在 10 步(包含 10 步)以内能将 A 变换为 B,则输出最少的变换步数;接下来若干行,每行有两个字符串 Ai​,Bi​,表示一条变换规则。共进行了 3 次变换,使得 A 变换为 B。第一行有两个字符串 A,B。 阅读详情
  

65. [NOIP2002] 字串变换

时间限制:1 s   内存限制:128 MB

[问题描述]

已知有两个字串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!"

[输入样例]

abcd xyz
abc xu
ud y
y yz

[输出样例]

3 
正解就是搜,深搜会超时,可以考虑广搜,即双向广搜,可以防止被卡数据,比如正向搜过慢,而反向搜很快的点。
先贴一发我dfs+神剪枝+卡数据的搜
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
string A,B,a[10],b[10];
int n=1,ans=11,cnt=0;
map<string,int> mp;
void dfs(string x,int len)
{
    cnt++;
    if(cnt>=40000){printf("NO ANSWER!\n");exit(0);}//深搜次数过多直接输出无解,卡数据。
	if(len>10||x.size()>20||len>ans)return;
	if(x==B){
	    ans=min(ans,len);
	    return;
	}
	string f=x;int k;
	for(int i=1;i<=n;i++){
		for(int j=0;j<x.size();j++)
		{
		   k=x.find(a[i],j);
	       if(k<100&&k>=0)
	       {
		  	    int l=a[i].size();
				x.replace(k,l,b[i]);
		  	    if(!mp.count(x))mp[x]=len,dfs(x,len+1);
		  	    else if(len<mp[x])dfs(x,len+1);
		  	    x=f;
		   }
		}
	}
}
int yjn()
{
	freopen("string.in","r",stdin);
	freopen("string.out","w",stdout);
	cin>>A>>B;
	while(cin>>a[n])cin>>b[n++];
	n--;
	mp[A]=++cnt;
	dfs(A,0);
	if(ans==11)printf("NO ANSWER!\n");
	else cout<<ans;
}
int qty=yjn();
int main(){;}

再贴一发正解
 
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<map>
  6. #include<string>
  7. #include<queue>
  8. using namespace std;
  9. struct node
  10. {
  11. string s;int num;
  12. };
  13. queue<node>q1,q2;
  14. map<string,int>m1,m2;
  15. string changings[6][2];
  16. int cnt,ans;
  17. string become(string now,int pos,int n,string tmp)
  18. {
  19. return now.replace(pos,n,tmp);
  20. }
  21. bool dbfs()
  22. {
  23. while(!q1.empty()&&!q2.empty())
  24. {
  25. node s1=q1.front(),s2;q1.pop();
  26. int len=s1.s.size();
  27. for(int i=0;i<len;i++)
  28. for(int j=0;j<cnt;j++)
  29. {
  30. int siz=changings[j][0].size();
  31. if(i+siz-1<len&&!s1.s.compare(i,siz,changings[j][0])&&!m1.count(become(s1.s,i,siz,changings[j][1])))
  32. {
  33. s2.s=become(s1.s,i,siz,changings[j][1]);
  34. s2.num=s1.num+1;
  35. if(s2.num>10)return 0;
  36. m1[s2.s]=s2.num;q1.push(s2);
  37. if(m2.count(s2.s))
  38. {
  39. ans=s2.num+m2[s2.s];
  40. return 1;
  41. }
  42. }
  43. }
  44. s1=q2.front(),s2;q2.pop();
  45. len=s1.s.size();
  46. for(int i=0;i<len;i++)
  47. for(int j=0;j<cnt;j++)
  48. {
  49. int siz=changings[j][1].size();
  50. if(i+siz-1<len&&!s1.s.compare(i,siz,changings[j][1])&&!m2.count(become(s1.s,i,siz,changings[j][0])))
  51. {
  52. s2.s=become(s1.s,i,siz,changings[j][0]);
  53. s2.num=s1.num+1;
  54. if(s2.num>10)return 0;
  55. m2[s2.s]=s2.num;q2.push(s2);
  56. if(m1.count(s2.s))
  57. {
  58. ans=s2.num+m1[s2.s];
  59. return 1;
  60. }
  61. }
  62. }
  63. }
  64. return 0;
  65. }
  66. int haha()
  67. {
  68. freopen("string.in","r",stdin);
  69. freopen("string.out","w",stdout);
  70. node a,b;cin>>a.s>>b.s;
  71. if(a.s==b.s)
  72. {
  73. cout<<0;
  74. return 0;
  75. }
  76. a.num=b.num=0;
  77. q1.push(a);q2.push(b);
  78. while(cin>>changings[cnt][0]>>changings[cnt][1])cnt++;
  79. m1[a.s]=0;m2[b.s]=0;
  80. if(dbfs())cout<<ans;
  81. else puts("NO ANSWER!");
  82. }
  83. int sb=haha();
  84. int main(){;}
基于verilog的16QAM调制 思路1:正交调幅法——实现16QAM调制,可以理解为时相位相差90度的两个正弦波的4PAM叠加。 4比特输入经过2->4进制转化得到两路2比特输入,然后分别经过4PAM后叠加所得输出即为16QAM调制结果。 具体程序稍后编写。 思路2:复合相移法——可以借助前面编写的QPSK,相当于两路幅度不同的QPSK的叠加,比如幅度分别取1和3 。 思路1正交调幅法的设计方案: 两正弦波相位差... 阅读详情

相关推荐

SQL注入绕过information_schema:实战技法与替代路径详解

SQL注入是Web安全领域的核心漏洞类型,其原理是通过构造恶意SQL语句,干扰应用程序与数据库的正常交互逻辑,从而窃取或篡改数据。在渗透测试与CTF竞赛中,绕过常见防护措施是提升技术能力的关键。当标准的信息收集方式受阻时,例如无法访问information_schema数据库,攻击者需要掌握替代的元数据获取方法。这些技术价值在于模拟真实环境中日益严密的防御体系,锻炼在受限条件下的系统性信息收集思维。典型的应用场景包括存在WAF过滤、权限限制或编码干扰的实战环境。本文将围绕SQL注入这一核心,深入探讨如何利用

weixin_33980459的博客 427

字串变换(双向广搜)

已知有两个字串A,B 及一组字串变换的规则(至多6个规则): A1→B1 A2→B2 … 规则的含义为:在A中的子串A1可以变换为B1、A2可以变换为B2… 例如:A=abcdB=xyz 变换规则为: abc→→xuud→→yy→→yz 则此时,A可以经过一系列的变换变为B,其变换的过程为: abcd→→xud→→xy→→xyz 共进行了三次变换,使得AA变换为BB。 输入格式 输入格式如下: A B A1 B1 A2 ...

听取WA声一片 518

基于IC617下Layout XL的使用

基于IC617下Layout XL的使用

weixin_43816759的博客 1万+

字串变换(AcWing, NOIP2002提高组)

字串变换(AcWing, NOIP2002提高组),使用双向BFS方法解决

zht2002的博客 637

YOLOv11n-seg 实战指南:从训练到模型部署的完整流程

本文提供了YOLOv11n-seg实例分割模型从环境准备、数据标注到模型训练、验证及最终部署的完整实战指南。详细讲解了如何准备多边形掩码数据、配置关键训练参数、解读分割核心评估指标,并重点介绍了将模型导出为ONNX等格式进行部署的流程与优化技巧,帮助开发者高效完成从开发到生产的全链路实践。

weixin_29062255的博客 552

【校园网代理连接问题】已解决,“该设备或资源(Web 代理)未设置为接受端口“7890”上的连接“

我遇到这个问题很多次。每次都是vpn的问题,不止通俗意义上的梯子(clash之类的),还包括校园网vpn。点击“ 拨号和虚拟专用网络设置”中的“设置”, 关闭代理服务器。在打开vpn后或者关闭vpn后无法浏览网页,网页诊断显示“关闭“手动设置代理”中的“使用代理服务器”,关闭对应的本地代理即可。

聆雨。 1万+

字串变换(搜索与图论、bfs)

已知有两个字串 A, B 及一组字串变换的规则(至多 6 个规则):A1→B1A2→B2…规则的含义为:在 A 中的子串 A1 可以变换为 B1、A2 可以变换为 B2…。例如:A= B=变换规则为: →→ →→ →→ 则此时,AA 可以经过一系列的变换变为 BB,其变换的过程为: →→ →→ →→ 共进行了三次变换,使得 A 变换为 B。输入格式输入格式如下:A B A1 B1 A2 B2 … …第一行是两个给定的字符串 AA 和 BB。接下来若干行,每行描述一组字串变换的规则。所有字符串长度

weixin_53469462的博客 272

并网逆变器学习笔记8---平衡桥(独立中线模块)控制

参考文献:《带独立中线模块的三相四线制逆变器中线电压脉动抑制方法》---赵文心。

圆桌骑士的博客 7301

《编程思维与实践》1042.字串变换

分两步解决:1.判断是否可以通过两种变换使所有的字符串变得相同;2.在能变换的前提下使变换的次数最少。其中第一步可以将每个字符串的基底(将连续重复出现的字符视为一个字符)求出来,如: aaabbb的基底就是ab,进而只需判断基底是否相同即可;第二步考虑贪心算法,只需要将每个基底变为相同实际字符数的变换次数最少即可,转化为数学语言也就是如果一个字符a出现的次数分别为x1​x2​...xn​, 需求出i∈12...n, 使得∣xi​−x1​∣...

boxueyuki的博客 798

华为OD机试双机位C卷-流浪地球(Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷【流浪地球】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,并提供在线OJ模拟做题。华为OD机试真题【流浪地球】。

qq_45776114的博客 3138

29、几何形态测量学在蝴蝶翅膀研究中的应用

本博客介绍了几何形态测量学在花斑木蛱蝶(Pararge aegeria)翅膀研究中的应用,探讨了环境因素对蝴蝶翅膀大小和形状的影响。通过选择合适的地标并采用Procrustes分析方法,研究揭示了不同景观类型下翅膀形状的差异及其潜在的适应性意义。文章还讨论了发育可塑性在飞行形态变异中的作用,并比较了几何形态测量学与其他传统方法的优势。最后提出了未来研究方向,包括多因素综合分析、发育机制探索及长期生态监测,为理解蝴蝶的适应性进化提供了重要线索。

ff678的博客 107

字串变换(BFS,字符串处理)

分析:很明显用搜索来做,将每种规则装入数组中,去搜索每种变换,直到找到需要的字符串为止,我这里是用BFS来解决的。 这里有一个坑点:在我们需要改变原始字符串是,不能用替换,否则原始字符串改变会影响其他变换规则的变换,这里我们只能使用拼接压入队列中 #include<cstdio> #include<string> #include<map> #include...

Anterior_condyle的博客 851

Android 9.0 SystemUI禁用长按recent键的分屏功能

​ 在9.0的系统产品开发中,系统对于多窗口模式默认会有分屏功能的,但是在某些产品中,需要禁用分屏模式,所以需要在导航栏中 禁用长按recent的分屏模式功能,接下来分析下相关分屏模式的实现 ​

安卓兼职framework和app工程师的博客 448

字串变换 双向广搜

双向广搜 同时从起点状态和终点状态开始广搜,从而提高搜索效率 190. 字串变换 已知有两个字串 AA, BB 及一组字串变换的规则(至多 66 个规则): A1→B1A1→B1 A2→B2A2→B2 … 规则的含义为:在 AA 中的子串 A1A1 可以变换为 B1B1、A2A2 可以变换为 B2…B2…。 例如:AA=abcd BB=xyz 变换规则为: abc` →→ `xu` `ud` →→ `y` `y` →→ `yz 则此时,AA 可以经过一系列的变换变为 BB,其变换的过程为: abcd` →

Gettler的博客 1734

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

双向广搜 [NOIP2002 提高组] 字串变换————洛谷p1032

在做这题之前,我们先来回顾一下字符串的一些基本操作,这很重要,尤其是本题主要用到substr函数和replace函数。这个qb也就是终点开搜的队列,他的交换规则要反过来,变换成value变成key,因为qb队列相当于模拟起点开搜qa队列的逆过程

2301_80093604的博客 1468

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

字串变换

又是尽力摆脱暴力学缠身的一天 题目链接:https://www.luogu.com.cn/problem/P1032 题目来自洛谷普及组 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A1->B1 A2->B2 ​规则的含义为:在 A中的子串 A1 可以变换为 B1,A2可以变换为 B2 …。 例如:A=abcd,B=xyz, 变换规则为: abc→xu...

九二六四的博客 808

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

双向广搜之字串变换

长度为20,每个点都有可能扩展6个,因此有120个,并且最长10步,因此最长的时间可能是120^10,因此必须采用双向广搜,一般应用于最小步数模型里面(这个里面的搜索状态可能会很大,因此采用,也就是优化)。只是扩展了一个节点,并不是扩展了一层节点,其次,A==B就不需要规则变动,直接return 0,因此需要修改,具体见代码二。步)以内能将 A变换为 B,则输出最少的变换步数;规则的含义为:在 A 中的子串 A1可以变换为 B1、A2可以变换为 B2…共进行了三次变换,使得 A变换为 B。

weixin_46006714的博客 437

双向广搜——AcWing 190. 字串变换

双向广搜是图搜索算法的一种变体,与传统的单向广搜不同,它同时从起点和终点(或目标状态)开始进行搜索,直到两个搜索的前沿相遇为止。这种方法可以在某些情况下显著减少搜索空间,尤其是在寻找两点间的最短路径时特别有效,因为搜索不是从一端到另一端,而是从两端向中间靠拢。

u014114223的博客 1170

P1032 字串变换

字串变换 已知有两个字串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。 共进行了3次变换,使得A变换...

扬弃 412

CODE[VS] 1099字串变换(双向广搜)

题目连接: CODE[VS] 1099字串变换(双向广搜)题目描述 Description 已知有两个字串 A,B, B 及一组字串变换的规则(至多6个规则):      A1−>B1 -> B1      A2−>B2 -> B2   规则的含义为:在 A$中的子串 A1可以变换为B1 可以变换为 B1、A2可以变换为B2 可以变换为 B2 …。     例如:A=′abcd

Dextrad_ihacker的博客 1200

洛谷 P1032 [NOIP 2002 提高组] 字串变换

如果一个字符串经过变换后得到的字符串是已经能从另一个源头出发变换得到,那么就找到了一条从起点到终点的路径,返回路径长度。解空间树中每个结点包含的状态为一个字符串s,该结点的子结点中的字符串为字符串s通过变换规则可以变化而成的字符串。后的字符串t,判断t是否已出现过,如果t未出现过,则标记t已出现过,而后将t加入队列,变化的步数要增加1。如果出队的字符串u是目标字符串,且步数小于等于10步,则返回变化步数。的长度为len,枚举字符串u中所有长为len的子串,如果存在子串为。的变换规则,已知字符串。

君义NOIP的博客 863

P1032 [NOIP2002 提高组] 字串变换 / AcWing190. 字串变换

经典的搜索题目

fengqishui的博客 946

洛谷—P1032 字串变换题解

题目链接: P1032 字串变换 解题思路: 题意已经把做法写得特别露骨了。。。最小步数,最多6个变换规则。。。。广搜自不必说,不仅可以寻找解而且还能判断步数(根据广搜首解最优的性质可以得到)。开两个数组记录串的转换关系,然后以a串(原串)为起点开始搜索,搜索目标是b串。需要一个map记录某个串是不是被搜到过,如果已经搜过了就不再继续搜 。我们枚举所有可能的转换手段,枚举当前队列中队头那个串的每一个位置,然后去尝试拼接,如果有相同串则拼接。拼接函数如下: inline string getStr(strin

NCU_tanghulu的博客 480

洛谷 P1032 [NOIP 2002 提高组] 字串变换-普及+/提高

本题不保证存在靠谱的多项式复杂度的做法。测试数据非常的水,各种做法都可以通过,不代表算法正确。因此本题题目和数据仅供参考。本题为搜索题,本题不接受 hack 数据。数据,保证所有字符串长度的上限为。,则输出最少的变换步数;接下来若干行,每行有两个字符串。NOIP 2002 提高组第二题。及一组字串变换的规则(至多。可以经过一系列的变换变为。可以变换为 $ B_1。A_2$ 可以变换为。,表示一条变换规则。

weixin_37253733的博客 1498

双向广搜算法精讲:从BFS优化到字串变换实战

广度优先搜索(BFS)是解决状态空间搜索和最短路径问题的经典算法,其核心原理是通过队列实现层序遍历,确保首次到达目标状态时路径最短。然而,在分支因子大、路径长的场景下,单向BFS面临状态空间指数爆炸的挑战。双向广搜通过从起点和终点同时发起搜索,并在中间相遇,将时间复杂度从O(b^d)优化至O(b^(d/2)),实现了指数级效率提升。该技术在解决诸如字符串变换、拼图游戏等状态转换问题时价值显著,能有效应对搜索空间膨胀。本文以字串变换这一经典问题为例,深入剖析双向广搜的算法框架、状态管理和相遇判断机制,并探讨其

weixin_31236101的博客 326
上一篇: 膜拜神犇lc 与非
下一篇: 概率DP [SCOI2008]奖励关
QTY_
博客等级 码龄9年 13粉丝 211原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值