Advertisement
vermashubhang

TSHIRTS ( CodeChef )

Oct 22nd, 2014
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <string>
  5. using namespace std;
  6. #define mod 1000000007
  7. int bitcount(int value);
  8. int getno(string str, int start, int end)
  9. {
  10.         int val =0;
  11.         for(int i=start;i<=end;i++)
  12.         {
  13.                 val = val*10 + (int)(str[i]-48);
  14.         }
  15.         return val;
  16. }
  17. long long int bitmask(int A[10][101], int size)
  18. {
  19.         int val = 1 << size;
  20.         long long int dp[1<<size][101];
  21.         for(int i=0;i<val;i++)
  22.         {
  23.                 for(int j=0;j<101;j++)
  24.                 {
  25.                         dp[i][j] = 0;
  26.                 }
  27.         }
  28.         for(int i=0;i<val;i++)
  29.         {
  30.             int mask = i;
  31.             int setbits = bitcount(mask);
  32.             for(int j=0;j<=100;j++)
  33.             {
  34.                 for(int k=0;k<size;k++)
  35.                 {
  36.                     if((mask&(1<<k))!=0 && A[k][j]==1)
  37.                     {
  38.                         if(j!=0)
  39.                         {
  40.                                 if(setbits == 1)
  41.                                         dp[mask][j] = 1;
  42.                                 else
  43.                                     dp[mask][j] = (dp[mask][j] + dp[mask ^ (1<<k)][j-1])%mod;
  44.                             //cout << mask << " " << j << " ::::"<< endl;
  45.                         }
  46.                         else
  47.                         {
  48.                                 if(setbits == 1)
  49.                                     dp[mask][j] = 1;
  50.                                 else
  51.                                         dp[mask][j] = 0;
  52.                             //cout << mask << " " << j << " ::"<< endl;
  53.                         }
  54.                     }
  55.                 }
  56.                 if(j!=0)
  57.                 dp[mask][j] = (dp[mask][j] + dp[mask][j-1])%mod;
  58.             }
  59.         }
  60.         return dp[val-1][100];
  61. }
  62. int bitcount(int value)
  63. {
  64.         int count =0;
  65.         long v1 = value;
  66.         while(v1!=0)
  67.         {
  68.             if(v1%2==1)
  69.             {
  70.                 count++;
  71.             }
  72.             v1 = v1/2;
  73.         }
  74.         return count;
  75. }
  76. int main()
  77. {
  78.         int t;
  79.         cin >> t;
  80.         while(t--)
  81.         {
  82.                 int n;
  83.                 cin >> n;
  84.             int ent[10]={0};
  85.             int A[10][101];
  86.             for(int i=0;i<10;i++)
  87.             {
  88.                 for(int j=0;j<101;j++)
  89.                 {
  90.                     A[i][j] = 0;
  91.                 }
  92.             }
  93.             for(int i=0;i<n;i++)
  94.             {
  95.                         string line;
  96.                         //cin >> line;
  97.                         getline(cin, line);
  98.                         if(line == "")
  99.                         {
  100.                                 i--;
  101.                                 continue;
  102.                         }
  103.                         int len=0;
  104.                         int start=0;
  105.                         int size =0;
  106.                         while(line[len] != '\0')
  107.                         {
  108.                                 len++;
  109.                                 if(line[len] == ' ')
  110.                                 {
  111.                                         int no = getno(line,start,len-1);
  112.                                         A[i][no] = 1;
  113.                                         start = len+1;
  114.                                         size++;
  115.                                         //cout << no << " ";
  116.                                 }
  117.                         }
  118.                         int val = getno(line,start,len-1);
  119.                         size++;
  120.                        // cout << val << endl;
  121.                         A[i][val] = 1;
  122.             }
  123.             long long int ans = bitmask(A,n);
  124.                 cout << ans << endl;
  125.         }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement