题意:给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);