洛谷 P1666 前缀单词 题解

题意:给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;
}
posted @ 2019-08-27 10:21  End_donkey  阅读(148)  评论(0编辑  收藏  举报