洛谷 P1666 前綴單詞

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);         
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章