题目描述
已知有两个字串 A,BA,BA,B 及一组字串变换的规则(至多 666 个规则):
A1A_1A1 -> B1 B_1B1
A2A_2A2 -> B2B_2B2
规则的含义为:在 AAA 中的子串 A1A_1A1 可以变换为 B1 B_1B1 , A2A_2A2 可以变换为 B2B_2B2 …。
例如: AAA =' abcdabcdabcd ' BBB =' xyzxyzxyz '
变换规则为:
‘ abcabcabc ’->‘ xuxuxu ’‘ ududud ’->‘ yyy ’‘ yyy ’->‘ yzyzyz ’
则此时, AAA 可以经过一系列的变换变为 BBB ,其变换的过程为:
‘ abcdabcdabcd ’->‘ xudxudxud ’->‘ xyxyxy ’->‘ xyzxyzxyz ’
共进行了 333 次变换,使得 AAA 变换为 BBB 。
输入输出格式
输入格式:
输入格式如下:
AAA BBB
A1A_1A1 B1B_1B1
A2A_2A2 B2B_2B2 |-> 变换规则
... ... /
所有字符串长度的上限为 202020 。
输出格式:
输出至屏幕。格式如下:
若在 101010 步(包含 101010 步)以内能将 AAA 变换为 BBB ,则输出最少的变换步数;否则输出"NO ANSWER!"
输入输出样例
输入样例#1: 复制
abcd xyz
abc xu
ud y
y yz
输出样例#1: 复制
3
这真TM是一道送命题qwq!!!!!!!!!!!!!!!!!
1.首先是这个读入string类型的不能直接用scanf读入,用cin读入,像这样:
while(cin>>cha[num2]>>chb[num2])num2++;
然后那天c++迷之骚操作读入后num2的值不加(今天再去试发现又可以加了)
2.就是一开始像:
((f))t
(f) t
会wa,因为我是
for(int i=0;i<=num;i++)
{
if(star[i]==cha[k][0])
{
r1=0;l1=i;
//cout<<star<<" "<<cha[k]<<endl;
while(star[i]==cha[k][r1]&&i<=num) {i++;r1++;}
if(r1==cha[k].size()) cau(k,l1,i-1);
i--;//一开始没有i--会爆蛤
}
}
3.就是时间复杂度的问题,这道题要判重复不然会有一个点t掉,后面看了大佬的题解学习了一发stl的map和string
- string类型首先不能一个个赋值,它只能这样a+=xxxx来一个个加上去,然后清空可以用a=""这样来清空。(好像memset可以清空string数组,注意头文件是cstring)
- 另外还有几个string的小函数:
注意s.replace(pos,len,s2)会改变s本身
-
下面还有map的学习资料(map单次操作时间复杂度为logn)
-
还有一些和map相关的函数:
-
当然还学到一手队列来写bfs,这样相当于vector(我不会)可以防止内存开太大(时间会慢一点)(同时还有优先队列)
-
重载运算符发现大佬们是这样写的(来自conquerheaven )(相反小根堆相同大根堆)(写在里面的话就一定要const)
bool operator<(Node a , Node b){ if(a.x == b.x) return a.y>b.y; return a.x>b.x; }
-
还有相应的函数(注意queue有front和back,priority_queue只有top)
最后是代码:
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<map> using namespace std; map<string,int> ma; string star,mid,des,cha[6],chb[6]; int l,r,l1,r1,num,num2; struct data { string dick; int ans,de; }; data f; queue<data> bfs; int cau(int k,int l1,int r1) { int i,num1; num1=cha[k].size(); mid=star; mid=mid.replace(l1,num1,chb[k]); if(ma.count(mid)) return 0; ma[mid]=1; f.dick=mid; f.ans=l+1;f.de=r+1; bfs.push(f); //cout<<star<<" "<<mid<<endl; } void deal(int k) { for(int i=0;i<=num;i++) { if(star[i]==cha[k][0]) { r1=0;l1=i; //cout<<star<<" "<<cha[k]<<endl; while(star[i]==cha[k][r1]&&i<=num) {i++;r1++;} if(r1==cha[k].size()) cau(k,l1,i-1); i--; } } } int bbfs() { while(!bfs.empty()) { f=bfs.front();star=f.dick;num=star.size()-1;bfs.pop(); l=f.ans;r=f.de; if(r>10) {printf("NO ANSWER!");return 0;} if(star==des){printf("%d",l);return 0;} for(int i=0;i<num2;i++) deal(i); } printf("NO ANSWER!"); } int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); cin>>star>>des; while(cin>>cha[num2]>>chb[num2]) num2++; ma[star]=1;f.dick=star;f.de=0;f.ans=0; bfs.push(f);bbfs(); // fclose(stdin);fclose(stdout); }