P1032字串变换

题目描述

已知有两个字串 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))\rightarrowt

(f) t

会wa,因为我是

	for(int i=0;i<=num;i++)
	{
		if(star[i]==cha[k][0])
		{
			r1=0;l1=i;
			//cout<

3.就是时间复杂度的问题,这道题要判重复不然会有一个点t掉,后面看了大佬的题解学习了一发stl的map和string

  • string类型首先不能一个个赋值,它只能这样a+=xxxx来一个个加上去,然后清空可以用a=""这样来清空。(好像memset可以清空string数组,注意头文件是cstring)
  • 另外还有几个string的小函数: 

    P1032字串变换_第1张图片

    注意s.replace(pos,len,s2)会改变s本身

  • 下面还有map的学习资料(map单次操作时间复杂度为logn)

  • P1032字串变换_第2张图片

    还有一些和map相关的函数:

    P1032字串变换_第3张图片

     

  • 当然还学到一手队列来写bfs,这样相当于vector(我不会)可以防止内存开太大(时间会慢一点)(同时还有优先队列)

  • P1032字串变换_第4张图片

    重载运算符发现大佬们是这样写的(来自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)

    P1032字串变换_第5张图片

    最后是代码:

    #include
    #include
    #include
    #include
    #include
    using namespace std;
    map 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 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<10) {printf("NO ANSWER!");return 0;}
            if(star==des){printf("%d",l);return 0;}
            for(int i=0;i>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);
    } 

     

你可能感兴趣的:(搜索)