Advertisement
vladm98

Untitled

Jun 14th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define maxN 16
  3. #define maxLen 505
  4. using namespace std;
  5. long long fact[]={1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600,6227020800,87178291200,1307674368000}; /// 0!, 1!, 2!, 3!,..., 15!
  6. char a[maxN][maxLen]; /// Primul set de siruri (S1)
  7. char b[maxN][maxLen]; /// Al doilea set de siruri (S2)
  8. int n,i,j,pi[maxLen];
  9. int lena[maxN],lenb[maxN]; /// Lungimile sirurilor din primul set (S1) si al doilea set (S2)
  10. vector<int> v[maxN];
  11. long long dp[maxN][1<<15]; /// Matricea pentru dinamica
  12.  
  13. bool findMatch(int x,int y) /// Cauta potrivirea
  14. {
  15. int L=lenb[y];
  16. int k=0;
  17. for(int i=1;i<=L;++i)
  18. {
  19. while(k>0&&b[y][i]!=a[x][k+1])
  20. k=pi[k];
  21. if(b[y][i]==a[x][k+1])
  22. ++k;
  23. if(k==lena[x])
  24. return true;
  25. }
  26. return false;
  27. }
  28.  
  29. int main()
  30. {
  31. ifstream f("matching.in");
  32. ofstream g("matching.out");
  33. f>>n;
  34. int maxC=(1<<n);
  35.  
  36. for(int i=1;i<=n;++i)
  37. f>>(a[i]+1)>>(b[i]+1),lena[i]=strlen(a[i]+1),lenb[i]=strlen(b[i]+1);
  38.  
  39. for(int i=1;i<=n;++i)
  40. {
  41. for(int j=1;j<=n;++j)
  42. if(findMatch(i,j))
  43. v[i].push_back(j-1);
  44. }
  45.  
  46. dp[0][0] = 1;
  47.  
  48. for(int i=1;i<=n;++i) /// Calculez dinamica
  49. for(int mask=0;mask<maxC;++mask)
  50. {
  51. if (i == __builtin_popcount(mask)){
  52. for(vector<int>::iterator it=v[i].begin();it!=v[i].end();++it)
  53. if(mask&(1<<(*it)))
  54. dp[i][mask]+=dp[i-1][mask^(1<<(*it))];
  55. }
  56. }
  57.  
  58. g<<1LL*(fact[n]-dp[n][maxC-1]);
  59. return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement