接龙游戏 [Codevs 1051]
AC通道:http://codevs.cn/problem/1051/
[分析]
法一:
看到這道題目,我的第一感覺就是字典樹。將輸入的每個(gè)字符串構(gòu)建一棵字典樹,對于每一個(gè)葉子結(jié)點(diǎn),統(tǒng)計(jì)以它到根的路徑上的節(jié)點(diǎn)為末尾的單詞的個(gè)數(shù),就是它能夠接出的最長的龍。結(jié)果我就把自己坑了。因?yàn)轭}目所給的空間只有128M,而字典樹所需要的空間比較大,所以這種解法是不可行的(至少我打不出來)。可憐我debug一個(gè)上午來省空間啊!
80分代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <string>using namespace std;int n,sssss=0,maxn=0,cnt; string s[100001];struct ss{char c;int nxt;ss(char a=0,int b=-1):c(a),nxt(b){} };struct Node{vector<ss>child;bool yes;Node(){yes=false;} };int havecheck(vector<ss>a,char b){if(a.empty())return false;for(vector<ss>::iterator it=a.begin();it!=a.end();it++){if((*it).c==b)return (*it).nxt;}return false; }vector<Node>trie;void make_tree(int x){ // printf("%s\n",s[x]);int l=(s[x]).size(),now=0,tmp;if(tmp=havecheck(trie[now].child,s[x][0])){now=tmp;}else{Node a;trie.push_back(a);sssss++; // trie[now].child[s[x][0]-'a']=++sssss;(trie[now].child).push_back(ss(s[x][0],sssss));now=sssss;}for(int i=1;i<l;i++){if(tmp=havecheck(trie[now].child,s[x][i])){now=tmp;}else{Node a;trie.push_back(a);sssss++;(trie[now].child).push_back(ss(s[x][i],sssss));now=sssss;}}trie[now].yes=true; }void dfs(int now,int tot){if(trie[now].yes)tot++;if((trie[now].child).empty()){if(tot>maxn)maxn=tot;return;}for(vector<ss>::iterator it=(trie[now].child).begin();it!=(trie[now].child).end();it++)dfs((*it).nxt,tot);if(tot>maxn)maxn=tot; }void dfs2(int now){if((trie[now].child).empty())return;for(vector<ss>::iterator it=(trie[now].child).begin();it!=(trie[now].child).end();it++){dfs2((*it).nxt);} }int main(){cin>>n;for(int i=1;i<=n;i++){cin>>s[++cnt];if(s[cnt]==s[cnt-1])cnt--;}Node a;trie.push_back(a);for(int i=1;i<=cnt;i++){make_tree(i);}dfs(0,0);dfs2(0);cout<<maxn<<endl;return 0; }
這個(gè)方法是我看題解才知道的。這個(gè)題目原來是一道棧的簡單題……因?yàn)榭梢园l(fā)現(xiàn)這個(gè)單詞接龍與我們以往的單詞接龍不同,它要求接在后面的單詞一定要是前面的單詞的前綴,所以我們可以先將單詞按照字典序排一個(gè)序,這樣,能夠接上的幾個(gè)單詞就都在一塊了。先將第一個(gè)單詞入棧,再判斷第二個(gè)單詞能否接上。若能接上,則繼續(xù)入棧。依此類推。直到有一個(gè)單詞接不上前面的單詞,就更新maxn為當(dāng)前棧的大小,然后退棧,看這個(gè)接不上的單詞與新的棧頂元素能否接上,如果不能接上,則繼續(xù)退棧,直到能夠接上為止,把這個(gè)單詞壓入棧(如果都接不上它,就讓棧中只留它一個(gè))。接下來就都一樣了。因?yàn)檫@個(gè)方法比較簡單,所以我就不附代碼了。看來,學(xué)東西不能學(xué)死板了。有時(shí)候,高級算法解決不了的問題,普通算法可以輕松解決呢。
總結(jié)
以上是生活随笔為你收集整理的接龙游戏 [Codevs 1051]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机毕业设计asp.net酒店客房管理
- 下一篇: 怎么修改照片dpi值?怎么提高照片分辨率