#include <bits/stdc++.h>
int fun(int i,int j,string &s1,string &s2,vector<vector<int>>&dp1){
if(j==-1 ) {
return 1;
}
if(i==-1 && j>=0) return 0;
if(dp1[i][j]!=-1) return dp1[i][j];
int nt=fun(i-1,j,s1,s2,dp1);
int t=0;
if(s1[i]==s2[j]){
t=fun(i-1,j-1,s1,s2,dp1);
}
return dp1[i][j]=(t || nt);
}
bool match(string &s1,string &s2){
int n=s1.size();
int m=s2.size();
if((n-m)!=1) return false;
vector<vector<int>>dp1(n+1,vector<int>(m+1,-1));
return fun(n-1,m-1,s1,s2,dp1);
}
int fun1(int i,int j,vector<string>&arr,vector<vector<int>>&dp,int n){
if(i==n) return 0;
if(dp[i][j+1]!=-1) return dp[i][j+1];
int nt=fun1(i+1,j,arr,dp,n);
int t=-1e9;
if(j==-1 or ((match(arr[i],arr[j])==true) )){
t= 1+fun1(i+1,i,arr,dp,n);
}
return dp[i][j+1]=max(t,nt);
}
bool comp(string s1 ,string s2){
return s1.length()<s2.length();
}
int longestStrChain(vector<string> &arr){
int n=arr.size();
sort(arr.begin(),arr.end(),comp);
vector<vector<int>>dp(n+1,vector<int>(n+1,-1));
return fun1(0,-1,arr,dp,n);
}


