P1032字串变换

博客探讨了如何在给定的字串变换规则下,通过最少的步骤将一个字符串转换成另一个字符串。讨论了C++中字符串处理的注意事项,如读入、赋值和清空操作,以及使用map和string函数的技巧。博主分享了使用BFS解决该问题的经验,提到了队列和优先队列在内存管理上的优势,并展示了重载运算符的写法。
摘要由CSDN通过智能技术生成

题目描述

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

     

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值