a53

matching

a53
Jun 14th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 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,1LL*479001600,1LL*6227020800,1LL*87178291200,1LL*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. char c[1030];
  9. int n,i,j,pi[1030];
  10. int lena[maxN],lenb[maxN]; /// Lungimile sirurilor din primul set (S1) si al doilea set (S2)
  11. vector<int> v[maxN];
  12. long long dp[maxN][1<<15]; /// Matricea pentru dinamica
  13.  
  14. bool findMatch(int x,int y) /// Cauta potrivirea
  15. {
  16. for(int i=2;i<=y;++i)
  17. {
  18. pi[i] = pi[i-1];
  19. while(pi[i]>0&&c[i]!=c[pi[i]+1])
  20. pi[i]=pi[pi[i]];
  21. if(c[i]==c[pi[i]+1])
  22. ++pi[i];
  23. if(pi[i]==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. {
  43. strcpy(c+1, a[i]+1);
  44. int l1 = strlen(c+1);
  45. c[l1+1] = '&';
  46. strcpy(c+2+l1, b[j]+1);
  47. int l2 = strlen(c+1);
  48. if(findMatch(l1,l2))
  49. v[i].push_back(j-1);
  50. }
  51. }
  52.  
  53. dp[0][0] = 1;
  54.  
  55. for(int i=1;i<=n;++i) /// Calculez dinamica
  56. for(int mask=0;mask<maxC;++mask)
  57. {
  58. if (i == __builtin_popcount(mask)){
  59. for(vector<int>::iterator it=v[i].begin();it!=v[i].end();++it)
  60. if(mask&(1<<(*it)))
  61. dp[i][mask]+=dp[i-1][mask^(1<<(*it))];
  62. }
  63. }
  64.  
  65. g<<1LL*(fact[n]-dp[n][maxC-1]);
  66. return 0;
  67. }
Add Comment
Please, Sign In to add comment