#include<iostream>
#include<algorithm>
using namespace std;
const int N = 200005;
int tree[N][26];
int h[26],cnt[N];
int idx=0,n;
char word[75];
void insert(char word[])
{
int p = 0;
int q=word[0]-'a';
int num=0;
for(int i = 0 ; word[i];i++)
{
int u = word[i]-'a';
if (!tree[p][u]) tree[p][u]=++idx;
if(cnt[p]>0) num++;
p=tree[p][u];
}
cnt[p]++;
h[q]=max(h[q],num+1);
}
int main()
{
cin >> n;
while(n --)
{
scanf("%s",word);
insert(word);
}
sort(h,h+26);
printf("%d",h[25]);
return 0;
}
建议加强数据,我这样做法都能AC,我的做法是按输入顺序将字符串按trie树存进去,并另外开一个数组cnt计数,即在字符串的末尾做个标记,每次遍历按照数的顺序往下走,每遇到一个字符串结尾,那以单词‘。。。。’开头的路径最长链++。
如果说数据中前面是长的字符串,后面是短的,那我这样做法AC不了,还得做些另外的处理。