Luogu P1245 電話號碼

2022-03-30 07:42:42 字數 3062 閱讀 1051

謹以此題解致敬我的初中英語老師孫菡老師,她帶的班默寫不過的人數總是像**號碼那樣屈指可數

本題的spj似乎已經基本沒有問題了,只要文末沒有多餘的空格和回車就能正常評測。

本題給出了26個字母與數字的對應關係,要求將一串數字翻譯為幾個單詞。

那麼我們是不需要關注各個單詞中的字母具體是什麼的,只需要存起來輸出的時候用一下就行了,翻譯過程中完全可以轉換為純數字操作。

具體地說:the->732she->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 遮蔽 號碼,固定...