1051 接龙游戏
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
题目描述 Description
给出了N个单词,已经按长度排好了序。如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙)。
你的任务是:对于输入的单词,找出最长的龙。
输入描述 Input Description
第一行为N(1<=N<=105)。以下N行每行一个单词(由小写组成),已经按长度排序。(每个单词长度<50)
输出描述 Output Description
仅一个数,为最长的龙的长度。
样例输入 Sample Input
5
i
a
int
able
inter
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
1<=N<=105
/*以字典序排序是比i小的单词都在i的前面 扫描一遍单词进行dfs插入 最后再dfs求树的深度*/ #include<cstdio> #include<iostream> #include<cstring> #include<vector> const int M=100010; using namespace std; char ch[M][60]; int n,l[M],flag,ans; vector<int>a[M]; bool aaaa(int k,int x) { if (l[k]>=l[x]) return false; for (int i=0;i<l[k];i++) if (ch[k][i]!=ch[x][i]) return false; return true; } void sou(int k,int x) { if (flag) return; for (int i=0;i<a[k].size();i++) if (aaaa(a[k][i],x)) { sou(a[k][i],x); return; } if(!flag) { a[k].push_back(x); flag=1; return; } } void dfs(int k,int t) { ans=max(ans,t); for (int i=0;i<a[k].size();i++) dfs(a[k][i],t+1); } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { cin>>ch[i]; l[i]=strlen(ch[i]); } for (int i=1;i<=n;i++) { flag=0; sou(0,i); } dfs(0,0); printf("%d",ans); return 0; }