题目描写叙述 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
思路:这题就是要用到哈希函数匹配字符串是否接龙,可是在处理上感觉比較机智的是栈的应用上,由于这题刚開始我也没太懂,所以费了100积分下载了别人
的代码,研究了好久才明确。在二维字符串数组排序上,对sort函数又加深了认识,不能直接来排序,二维数组在sort中不能够直接放入排序的。栈又把时间提
高了好多,达到了线性条件。
#include <cstdio> #include <cstring> #include <algorithm> #include<iostream> using namespace std; struct node { int len; char a[55]; }e[100005]; int Stack[100005]; bool operator < (node b,node c) { for(int i=0;i<c.len&&i<b.len;i++) { if(b.a[i]<c.a[i]) return true; else if(b.a[i]>c.a[i]) return false; } return b.len<c.len; } int hash(char *s,int len) { int sum=0; for(int i=0;i<len;i++) sum=sum*26+s[i]-'a'; return sum; } int main() { int n,i,sum=0,top=0; cin>>n; for(i=1; i<=n; i++) { scanf("%s",e[i].a); e[i].len=strlen(e[i].a); } sort(e+1,e+n+1); for(i=1;i<=n;i++) { while((top)&&e[i].len<=e[Stack[top]].len||hash(e[Stack[top]].a,e[Stack[top]].len)!=hash(e[i].a,e[Stack[top]].len)) top--; Stack[++top]=i; if(sum<top) sum=top; //cout<<sum<<' '<<top<<' '<<i<<endl; } cout<<sum<<endl; return 0; }