字串变换

问题 H: 字串变换

时间限制: 1 Sec   内存限制: 128 MB

题目描述

已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则):
A1$ -> B1$
A2$ -> B2$
规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$、A2$ 可以变换为 B2$ …。
例如:A$='abcd' B$='xyz'
变换规则为:
‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’

则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为:
‘abcd’->‘xud’->‘xy’->‘xyz’

共进行了三次变换,使得 A$ 变换为B$。

输入

键盘输人文件名。文件格式如下:
A$ B$
A1$ B1$ \
A2$ B2$  |-> 变换规则
... ... / 
所有字符串长度的上限为 20。

输出

输出至屏幕。格式如下:
若在 10 步(包含 10步)以内能将 A$ 变换为 B$ ,则输出最少的变换步数;否则输出"NO ANSWER!"

样例输入

abcd wyz
abc xu
ud y
y yz

样例输出

3




 
 
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<queue>
#include<set>
#include<map>
#include<deque>
#include<cstdlib>
#include<algorithm>
#define V 25
#define p 1000007
#define pp 131
#define LL long long
#define eps 1e-8
using namespace std;
string sd,sb,mb[1000],md[1000];
string w[V*V*V*V];
int ans=p,id=1,ww[V*V*V*V],vis[1050007];
int ddd=0,sbb,sdd,mbb[1000],mdd[1000];
inline int has(string dd)
{
     unsigned long long qq=0;
     int len=dd.size();
     for ( int i=1;i<=len;i++)
     qq=qq *pp +dd[i-1];
     //cout<<qq%p<<" #$% #"<<"  "<<dd<<endl;
     return qq %p ;
}
inline void bfs()
{
     //cout<<V*V*V*V<<endl;
     int head,tail;
     head=tail=0;
         //cout<<"#$# %$"<<endl;
         tail=1;
     w[++head]=sd;
     ww[head]=0;
     string bb;
     int zz,as,len,hd,js;
     int vs=0;
     while (tail<=head)
     {
         bb=w[tail];
         as=ww[tail];
         if(as>=10)break;
           for ( int i=1;i<=id;i++)
           {
                   hd=0;
                 while (1)
                 {
                     bb=w[tail]; repalce 后自己即变 须重新设值
                     zz=bb.find(mb[i],hd);
                     if (zz==-1) break ;
                     len=mb[i].size();
                     string bs=bb.replace(zz,len,md[i]);
                     if (bs==sb)
                     {
                           cout<<as+1;
                             exit (0);   
                     }
                     js=has(bs);
                     if(vis[js])
                     {
                           hd=zz+1;
                           continue ;
                     }
                     
                     w[++head]=bs;
                     vis[js]=1;
                     ww[head]=as+1;
                     hd=zz+1;
                }
           }
           tail++;
     }
}
inline int haha()
{
   // freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);
    //freopen("string.in","r",stdin);freopen("string.out","w",stdout);
    cin>>sd>>sb;
    sdd=has(sd);
    vis[sdd]=1;
    sdd=has(sb);
    vis[sdd]=1;
    while (cin>>mb[id]>>md[id])
    id++;
    id--;
    bfs();
    //cout<<ans<<endl;
    if (ans<=10)
    cout<<ans;
    else
    cout<< "NO ANSWER!" ;
    return 0;
}
int gg=haha();
int main()
{;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值