[NOIP2002 提高组] 字串变换(无向图查重)
1.妖梦拼木棒2.[USACO1.2]回文平方数 Palindromic Squares3.[COCI2012-2013#1] LJUBOMORA4.火柴棒等式5.Kieszonkowe6.[COCI2014-2015#5] TRAKTOR7.硬币翻转8.[蓝桥杯 2020 省 AB1] 走方格9.P2097 资料分发10.[AHOI2005]约数研究11.[NOIP2004 普及组] 火星人12.我焯,原神(这真是个题)13.滑雪 OJ365114.CV的人有福啦!YTU贪心训练2(部分注释)15.砝码称重16.警钟长鸣-----找零钱17.[USACO09OCT]Barn Echoes G18.【CSGRound2】光骓者的荣耀19.初见蓝桥杯20.[蓝桥杯 2022 省 B] 扫雷21.开餐馆22.P9241 [蓝桥杯 2023 省 B] 飞机降落23.P7083 [NWRRC2013] Energy Tycoon24.高精度25.P7954 [COCI2014-2015#6] PAPRIKA26.(输出路径搜索)[USACO06OCT] Cows on Skates G27.畜栏保留问题28.(贪心+搜索+剪枝)P8801 [蓝桥杯 2022 国 B] 最大数字29.蓝桥杯 入门----普及-30.[NOIP2016 提高组] 玩具谜题
31.[NOIP2002 提高组] 字串变换(无向图查重)
32.[NOIP2000 提高组] 单词接龙33.POJ 硬币34.动态规划学习 1(最长上升子序列问题)35.动态规划学习 2(背包问题及其变形)36. 切割回文37.[NOIP2001 提高组] 数的划分(剪枝)38.字符串转换数字,sscanf和sprintf大法39.[CTSC1997] 选课(树状DP)40. k 倍区间(同余定理,组合数)41.[蓝桥杯 2018 省 AB] 全球变暖42.马的遍历(对bfs的更深一层探讨)43.找零钱44.Pasha Maximizes45.Newspaper Headline46.Balanced Ternary String47.(数论)素数,质数48.(数论) 约数49.Helping the Nature50.(博弈论)Even Number Addicts51.Present52.Mr. Kitayuta's Colorful Graph(二维并查集,弱化版)53.Edgy Trees(dfs,并查集,快速幂,树形结构,红黑树)54.并查集55.再谈 前缀和,差分,离散化56.Best Cow Fences(前缀和+特殊二分)57.二分58.同类型,类背包动态规划,选地dp59.Primes on Interval(欧拉筛+二分+滑动窗口)60.字符串(KMP , Trie树 , STL)61.Codeforces1 #879 div.262.Add Modulo 10(数论,思维,数学,规律)63.期末考试YTU4035: Shmily(数学,等差数列)64.[POI2006] OKR-Periods of Words65.Getting Zero(Bfs)66.快速幂67.Dreaming of Freedom(数论,贪心)68.Scoring Subsequences69.Dolce Vita70.Cake Assembly Line71.Constructive Problem72.Forever Winter73.Maximum Sum(前缀和)74.Contrast Value(数学规律)75.Lamps(STL+双端队列)76.Long Long77.Sum in Binary Tree78.Apple Tree(树状搜索,树形DP)79.Strong Password(贪心思想)80.Come Together81.Notepad82.Hamiltonian Wall83.7.17作业84.逛画展(双指针)85.#88586.树状数组87.Subsequence Addition88.7.22作业89.Diverse Substrings90.Tracking Segments(二分,区间前缀)91.最大食物链计数92.线段树193.[TJOI2007] 线段(状态机)94.#87895.测试196.李白打酒97.砍竹子[NOIP2002 提高组] 字串变换
题目背景
本题疑似错题,不保证存在靠谱的多项式复杂度的做法。测试数据非常的水,各种做法都可以通过,不代表算法正确。因此本题题目和数据仅供参考。
题目描述
已知有两个字串 ,A,B 及一组字串变换的规则(至多 66 个规则),形如:
- 1→1A1→B1。
- 2→2A2→B2。
规则的含义为:在 A 中的子串 1A1 可以变换为 1B1,2A2 可以变换为 2⋯B2⋯。
例如:=abcdA=abcd,=xyzB=xyz,
变换规则为:
- abc→xuabc→xu,ud→yud→y,y→yzy→yz。
则此时,A 可以经过一系列的变换变为 B,其变换的过程为:
- abcd→xud→xy→xyzabcd→xud→xy→xyz。
共进行了 33 次变换,使得 A 变换为 B。
输入格式
第一行有两个字符串 ,A,B。
接下来若干行,每行有两个字符串 ,Ai,Bi,表示一条变换规则。
输出格式
若在 1010 步(包含 1010 步)以内能将 A 变换为 B,则输出最少的变换步数;否则输出 NO ANSWER!
。
输入输出样例
输入 #1
abcd xyz abc xu ud y y yz
输出 #1
3
说明/提示
对于 100%100% 数据,保证所有字符串长度的上限为 2020。
双端队列做法
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 unordered_map<string,int>mp;//无向图去重 5 string st,ed,s1[10],s2[10]; 6 int res,n; 7 void bfs(string st) 8 { 9 queue<string>que;//双端队列,一个是字符串,一个是次数 10 queue<int>num; 11 que.push(st),num.push(0); 12 while(!que.empty()) 13 { 14 string now=que.front(),tmp=que.front(),tmp1=que.front(); 15 int nownum=num.front(); 16 que.pop(),num.pop(); 17 if(mp.count(now)) continue;//剪枝 18 if(nownum>10) 19 { 20 cout<<"NO ANSWER!"; 21 return; 22 } 23 if(now==ed) 24 { 25 cout<<nownum; 26 return; 27 } 28 mp[now]=1; 29 for(int i=0;i<res;i++) 30 { 31 now=tmp1; 32 while(1) 33 { 34 int x=now.find(s1[i]);//寻找队头字符串是否可以被替换 35 if(x==-1) break;//不行的话就断 36 tmp=tmp1; 37 tmp.replace(x,s1[i].size(),s2[i]);//把队头字符串中所有含有s1字符串的全替换了 38 //某个String a.replace(pos,len,另一个String b) 替换a中pos开始往后len的这些字符为b 39 que.push(tmp),num.push(nownum+1); 40 now[x]='~';//要把它变成没用字符,不然后下次while循环还是会搜到,会爆 41 } 42 } 43 } 44 cout<<"NO ANSWER!"; 45 return; 46 } 47 int main() 48 { 49 cin>>st>>ed; 50 while(cin>>s1[res]>>s2[res]) res++; 51 bfs(st); 52 return 0; 53 }
结构体做法
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+10; 4 int res; 5 string st,ed,s1[10],s2[10]; 6 unordered_map<string,int>mp; 7 struct node 8 { 9 string s; 10 int num; 11 }; 12 void bfs() 13 { 14 queue<node>que; 15 node str; 16 str.s=st,str.num=0; 17 que.push(str); 18 while(!que.empty()) 19 { 20 node now=que.front(); 21 string tmp,tmp1=now.s; 22 que.pop(); 23 if(mp.count(now.s)) continue; 24 mp[now.s]=1; 25 if(now.num>10){ 26 cout<<"NO ANSWER!"; 27 return; 28 } 29 if(now.s==ed){ 30 cout<<now.num; 31 return; 32 } 33 for(int i=0;i<res;i++) 34 { 35 string nexts=now.s; 36 while(1) 37 { 38 int x=nexts.find(s1[i]); 39 if(x==-1) break; 40 tmp=tmp1; 41 tmp.replace(x,s1[i].size(),s2[i]); 42 node next; 43 next.s=tmp,next.num=now.num+1; 44 que.push(next); 45 nexts[x]='~'; 46 } 47 } 48 } 49 cout<<"NO ANSWER!"; 50 return; 51 } 52 int main() 53 { 54 cin>>st>>ed; 55 while(cin>>s1[res]>>s2[res]) res++; 56 bfs(); 57 return 0; 58 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)