过了 #1,2,3,5 求hack做法or调
简单来说就是按长度排序后找前面能接上的就接上去
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define _ 500005
ll n,ans[_],tot;
string a[_];
bool cmp(string a,string b) {
if(a.size()!=b.size()) return a.size()<b.size();
else return a<b;
}
struct trie {
ll tt;
struct point {ll son[27],bj;} tr[_*6];
ll getnum(char x) {return x-'a';}
void add(string a,ll k) {
ll x=0,siz=a.size();
for(ll i=0;i<siz;i++) {
ll op=getnum(a[i]);
if(!tr[x].son[op]) tr[x].son[op]=++tt;
x=tr[x].son[op];
}
tr[x].bj=k;
}
ll find(string a) {
ll x=0,siz=a.size(),s=0,k=0;
for(ll i=0;i<siz-1;i++) {
ll op=getnum(a[i]);
if(!tr[x].son[op]) return 0;
x=tr[x].son[op];
}
s=max(s,ans[tr[x].bj]),k=tr[x].bj;
for(ll i=0;i<26;i++) {
if(ans[tr[tr[x].son[i]].bj]>s) k=tr[tr[x].son[i]].bj,s=ans[tr[tr[x].son[i]].bj];
}
return k;
}
}tr;
int main() {
// ios::sync_with_stdio(0);
// cin.tie(0),cout.tie(0);
cin>>n;
for(ll i=1;i<=n;i++) cin>>a[i],reverse(a[i].begin(),a[i].end());
sort(a+1,a+n+1,cmp);
ll s=0;
for(ll i=1;i<=n;i++) {
ll op=tr.find(a[i]);
// cout<<ans[op]+1<<' '<<a[i]<<endl;
s=max(s,ans[op]+1);
if(op==0) tr.add(a[i],++tot),ans[tot]=1;
else tr.add(a[i],op),ans[op]++;
}
cout<<s;
return 0;
}
/*
4
abc
bc
dc
bdc
*/
QWQ