1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
using namespace std; typedef long long ll; const int maxn=(1<<20)+100;
char str1[20],str2[20]; char name[20][20]; int n,m,cnt[20], len; ll dp[maxn];
void () { memset(cnt,0,sizeof(cnt)); n=0; } int main() {
while(scanf("%d",&m)!=EOF) { init(); int u,v; for(int i=0;i<m;i++) { scanf("%s%s",str1,str2); for(u=0;u<n;u++) if(strcmp(name[u],str1)==0) break; if(u==n) strcpy(name[n++],str1); for(v=0;v<n;v++) if(strcmp(name[v],str2)==0) break; if(v==n) strcpy(name[n++],str2); cnt[v]|=(1<<u); } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=0;i<(1<<n);i++) { if(dp[i]!=0) { for(int j=0;j<n;j++) { if(!(i&(1<<j))) {
if((i&cnt[j])==cnt[j]) { dp[i|(1<<j)]+=dp[i]; } } } } } printf("%lldn",dp[(1<<n)-1]); } return 0; }
|
近期评论