謹以此題解致敬我的初中英語老師孫菡老師,她帶的班默寫不過的人數總是像**號碼那樣屈指可數
本題的spj似乎已經基本沒有問題了,只要文末沒有多餘的空格和回車就能正常評測。
本題給出了26
個字母與數字的對應關係,要求將一串數字翻譯
為幾個單詞。
那麼我們是不需要關注各個單詞中的字母具體是什麼的,只需要存起來輸出的時候用一下就行了,翻譯過程中完全可以轉換為純數字操作。
具體地說:the->732
,she->732
,對於密碼中的732
,它們是完全等價的。所以我們建立乙個陣列用於轉換:
const char st[26]=;
然後題目變成了:給定目標串,要求將它拆解為多個模式串首尾相連的結果。
ac自動機字典樹+深度優先搜尋
先上**:
inline void init(char *a)
b[i]='\0';
return;
}
inline void insert(char *a,const int &id)
else
} p->end=id;
return;
}
我先使用init(str[i])
將str[i]
(第i
個單詞)轉換為純數字儲存在b
中,然後使用insert(b,i)
執行插入操作。為了方便搜到答案之後輸出,我將單詞的編號i
傳遞進函式,用編號作為trie
中字串的結尾標記trie::end
,這樣就可以方便地一邊深搜一邊統計答案。
另外,比如the->732
&she->732
,就會執行兩次完全相同的插入過程,但是我們不需要考慮這個問題,因為按照題意,它們完全等價,end
中會儲存較晚插入的那個單詞的編號,而題目只要求輸出一組可行解。
值得一提的是insert(b,i)
前我還進行了特判if(*b)
:
for(i=1;i<=n;++i)
這個操作的用意是判斷b
是否是空串,理論上來說不可能會有這種情況,可是我切這道題是遇到了trie
的根節點莫名其妙被標記為字串末尾的現象,就這樣解決了......目前還沒有查出問題根源,如果大佬們ac
了這道題,請勞駕前往這裡幫我看看是不是我哪個地方寫醜了。。
先上**:
void dfs(int x)
if(p->son[a[x]])
else
} if(p->end)
return;
}
變數說明
x
為當前待匹配的數字的下標;
指標p
用於檢索trie
樹;
ans
用於儲存當前搜到的狀態。
dfs過程
我們使用trie
將所有單詞記錄後,對密碼串從前到後掃瞄,並在trie
中查詢,每查到乙個單詞的末尾標記,就說明這個地方是有可能斷開成為乙個單詞的,就儲存這個單詞的編號(即每次搜到p->end!=0
說明可能要從這裡劃斷,就先ans[++cnt]=p->end
,儲存這個詞的編號,dfs(x)
把當前這個待匹配位置留給下一層搜尋,如果回溯回來了,cnt--
清除即可),從這個地方再遞迴一層考慮是否可行。如果一直這樣到了密碼串末尾,就找到了一組解,輸出即可;如果到某個地方trie
上匹配不到了,就說明之前某個地方劃分錯了,應該回溯,return
即可。如果一直退回到main()
都沒找到解,說明no solution!
。
//p1245 **號碼
#include#include#include "memory.h"
#define maxn 110
using namespace std;
const char st[26]=;
struct trie
mmp[maxn*maxn],*mtp=mmp,*head=null;
char str[maxn][maxn],a[maxn],b[maxn];
int ans[maxn],cnt=0,n=0;
inline void read(int&);
void write(const int&);
inline void insert(char*,const int&);
inline void init(char*);
void dfs(int);
inline void out();
int main()
for(i=1;i<=n;++i)
dfs(0);
printf("no solutions!");
return 0;
}inline trie::trie()
inline void out()
if(p->son[a[x]])
else
} if(p->end)
return;
}inline void init(char *a)
b[i]='\0';
return;
}inline void insert(char *a,const int &id)
else
} p->end=id;
return;
}
洛谷P1245電話號碼
題目 機上每乙個數字下面都寫了若干個英文本母。分布如下 1 abc 2 def 3 ghi 4 jkl 5 mn 6 opq 7 rst 8 uvw 9 xyz 現在給定乙個單詞表和一串數字密碼,請你用單詞表中的單詞翻譯這個密碼。輸入格式 第一行為乙個正整數n表示單詞表中單詞的個數 n 100 第二...
電話號碼問題
問題描述 商業單位需要容易記憶的 號碼,有一些方法可以讓 號碼變得更容易記憶。譬如,可以把 號碼寫成單詞或短語,如 mon glop 可以代表滑鐵盧大學的 有時僅僅是把號碼的一部分寫成單詞,如打 310 gino 便可向 gino 比薩餅店定購比薩。另一種讓 號碼容易記憶的方法是將數字用一種容易記的...
遮蔽電話號碼
private static final string regex fixedphone 010 02 d 0 3 9 d d private static final pattern pattern zipcode pattern.compile regex fixedphone 遮蔽 號碼,固定...