1. 程式人生 > >P1032 字串變換

P1032 字串變換

its sin 替換 body pos != spa abcd pla

蒟蒻的解題報告

P1032 字串變換

題目描述

已知有兩個字串 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!”

輸入輸出樣例

輸入樣例#1:
abcd xyz
abc xu
ud y
y yz
輸出樣例#1:
3

第一反應是string,然而蒟蒻學藝不精,啥都不會
string 這個博客很不錯。

string後就沒什麽啦,第四個點註意一下,要剪掉一部分

  1. 替換後增加的最短長度*剩余最多步數如果還大於目標長度,剪掉
  2. 替換後增加的最長長度*剩余最多步數如果還小於目標長度,剪掉

貼代碼

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 string ibeg,ifin;
 4 map<string,int>h;
 5 string a[10],b[10];
 6 int la[10],lb[10],mn=0x3f3f3f3f,mx=0,i=1;
 7 void f(string x,int step)
 8 {
 9     if (step>=10) return ;
10     int u=x.size(),v=ifin.size();
11     if (u+mx*(10-step)<v) return
; 12 if (u+mn*(10-step)>v) return ; 13 for (int j=1;j<i;j++) { 14 int pos=x.find(a[j],0); 15 while (pos != string::npos){ 16 string tmp=x; 17 tmp.replace(pos,la[j],b[j]); 18 if (( h[tmp]==0 && tmp!=ibeg) || (h[tmp]>h[x]+1) ) 19 { 20 h[tmp]=h[x]+1; 21 f(tmp,step+1); 22 } 23 pos=x.find(a[j],pos+1); 24 } 25 } 26 } 27 int main() 28 { 29 cin>>ibeg>>ifin; 30 while (cin>>a[i]>>b[i]) 31 { 32 la[i]=a[i].size(); 33 lb[i]=b[i].size(); 34 mn=min(mn,lb[i]-la[i]); 35 mx=max(mx,lb[i]-la[i]); 36 i++; 37 } 38 f(ibeg,0); 39 if ( h[ifin]!=0 ) printf("%d\n",h[ifin]); 40 else printf("NO ANSWER!"); 41 return 0; 42 }

代碼 C++,1KB
提交時間 2018-01-12 13:52:33
耗時/內存 164ms, 4210KB

P1032 字串變換