https://www.luogu.org/problem/show?pid=1666
首先空集合也是答案,所以樣例是對的;
那麼我們思考;
假如兩個串ab;
a< b
如果這個時候a不是b的前綴;
那麼所有字典序小於a的並且不是a的前綴的字符串均不是b的前綴;
所以我們先對串排序,然後直接dp
f[i][j]表示1~j號串裏取i個(j號必須取)的所喲方案數;
f[0][0]=0;
#include<bits/stdc++.h>
#define Ll long long
using namespace std;
const Ll N=55;
string s[N];
Ll f[N][N];
Ll n,ans;
bool can(string a,string b){
Ll l=min(a.length(),b.length());
for(Ll i=0;i<l;i++)if(a[i]!=b[i])return 1;
return 0;
}
int main()
{
scanf("%lld",&n);
for(Ll i=1;i<=n;i++)cin>>s[i];
sort(s+1,s+n+1);
f[0][0]=1;
for(Ll i=1;i<=n;i++)
for(Ll j=1;j<=n;j++)
for(Ll k=0;k<j;k++)
if(!k||can(s[k],s[j]))
f[i][j]+=f[i-1][k];
for(Ll i=0;i<=n;i++)
for(Ll j=0;j<=n;j++)
ans+=f[i][j];
printf("%lld",ans);
}