a53

matching_70 pct

a53
May 28th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 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); /// 2^n
  35.  
  36. for(int i=1;i<=n;++i) /// Citesc seturile de siruri S1 si S2
  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. for(int i=0;i<=n;++i) /// initializez dinamica
  47. dp[i][0]=1;
  48.  
  49. for(int i=1;i<=n;++i) /// Calculez dinamica
  50. for(int mask=0;mask<maxC;++mask)
  51. {
  52. dp[i][mask]+=dp[i-1][mask];
  53. for(vector<int>::iterator it=v[i].begin();it!=v[i].end();++it)
  54. if(mask&(1<<(*it)))
  55. dp[i][mask]+=dp[i-1][mask^(1<<(*it))];
  56. }
  57.  
  58. g<<fact[n]-dp[n][maxC-1];
  59. return 0;
  60. }
Add Comment
Please, Sign In to add comment