洛谷 P1666 前缀单词 题解

拥有回忆 提交于 2019-11-28 17:37:12

题意:给n个单词,如果单词a为单词b的前缀则a,b不能共存,问能共存的集合数(包括空集)

一道dp题,排序后判断,f[i][j]表示i和j是否能共存,f[i][j]=1表示能共存,初始化dp[i]=1,表示只有i一个单词,dp[i]表示前i个单词且一定含有第i个单词的集合数,如果f[i][j]=1,则dp[j]+=dp[i] (size(j)>=size(i))

代码

#include<bits/stdc++.h>
using namespace std;
string a[60];
long long dp[60],ans;
bool f[60][60];
int n;
bool clu(int i,int j){
    if(a[i].size()>a[j].size()) swap(i,j);
    return a[j].find(a[i])!=0;
}
int main(){
    freopen("prefix.in","r",stdin);
    freopen("prefix.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;++i){
        dp[i]=1;
        for(int j=1;j<=n;++j) f[i][j]=clu(i,j);
    }
    for(int i=1;i<=n;++i){
        for(int j=i;j<=n;++j){
            if(f[i][j]) dp[j]+=dp[i];
        }
    }
    for(int i=1;i<=n;++i){
        ans+=dp[i];
    }
    printf("%lld",ans+1);
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!