日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

接龙游戏 [Codevs 1051]

發(fā)布時(shí)間:2024/1/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接龙游戏 [Codevs 1051] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。