luoguP1032

字符串骚操作

str.repalce( int s,int len,string str )

将起点为s,长度为len的字符串替换成str

str.insert( int s,string str ) 

起点为s,插入str

划重点,这题要是用insert一首凉凉。因为删除操作后下表会改变,insert个鬼哦

#include <bits/stdc++.h>
using namespace std;
typedef pair<string,int> pii;
set<string> se;
string ss1[10];
string ss2[10];
string A,B;
int n;
bool match( const string& s1,const int num,vector<string>& ve ){
    int len1 = s1.length();
    int len2 = ss1[num].length();
    string& s2 = ss1[num];
    for(int i = 0;i <= len1 - len2;i++ ){
        bool flag = true;
        for( int j = 0;j < len2;j++ ){
            if( s1[i+j] !=  s2[j] ){
                flag = false;
                break;
            }
        }
        if( flag ){
            string str = s1;
            str.replace( i,len2,ss2[num] );
            ve.push_back( str );
        }
    }
    if( ve.size() ) return true;
    return false;
}
queue<pii> que;
int bfs(  ){
    que.push( pii(A,0 ) );
    while( que.size() ){
        pii x = que.front();
        if( x.second >= 11 ) return -1;
        if( x.first == B ){
            return x.second;
        }
        que.pop();
        string str = x.first;
        for( int i = 1;i <= n;i++ ){
            vector<string> ve;
            if( match( str,i,ve ) ){
                for( int i = 0;i < ve.size();i++ ){
                    if( se.find( ve[i] ) ==se.end() ){
                        se.insert( ve[i] );
                        que.push( pii( ve[i],x.second+1 ) );
                    }
                }
            }
        }
    }
    return -1;
}
int main()
{
    string x,y;
    cin >> A >> B;
    int i= 0;
    while( cin >>x >> y ){
        ss1[++i] = x;
        ss2[i] = y;
    }
    n = i;
    se.insert( A );
    int re = bfs();
    if(re != -1){
        printf("%d",re);
    }else{
        printf("NO ANSWER!");
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值