Rkhamim

Untitled

Apr 24th, 2021
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 805;
  4. const int K = 62;
  5. int node,n,m;
  6. char ch[135];
  7. double ab[135];
  8. int Next[K][N], fail[N],tes[102][805],ran[128];
  9. double dp[102][805];
  10. bool endMark[N], vis[N];
  11. void init()
  12. {
  13. for(int i = 0; i < K; i++) {
  14. for(int j = 0; j <=node ; j++) {
  15. Next[i][j] = 0;
  16. }
  17. }
  18. for(int i = 0; i <= node; i++) {
  19. endMark[i] = false;
  20. vis[i] = false;
  21. }
  22. node=0;
  23. }
  24. double cal(int cur,int ver)
  25. {
  26. if(tes[cur][ver]!=-1)return dp[cur][ver];
  27. if(endMark[ver])return 0.0;
  28. if(cur==m)return 1.0;
  29. double res=0.0;
  30. for(int i=0;i<n;i++)
  31. {
  32. int id = ran[ch[i]];
  33. int v=ver;
  34. while(v && !vis[Next[id][v]]) {
  35. v = fail[v];
  36. }
  37. v = Next[id][v];
  38. res+=ab[i]*cal(cur+1,v);
  39. }
  40. dp[cur][ver]=res;
  41. tes[cur][ver]=1;
  42. return res;
  43. }
  44. void Insert(string s)
  45. {
  46. int v = 0;
  47. for(int i = 0; i < s.size(); i++) {
  48. int id = ran[s[i]];
  49. if(!vis[Next[id][v]]) {
  50. Next[id][v] = ++node;
  51. vis[node] = true;
  52. }
  53. v = Next[id][v];
  54. }
  55. endMark[v] = true;
  56. }
  57.  
  58. void build_fail()
  59. {
  60. queue<int>q;
  61. for(int id = 0; id < K; id++) {
  62. if(vis[Next[id][0]]) {
  63. q.push(Next[id][0]); // root's child
  64. }
  65. }
  66. while(!q.empty()) {
  67. int u = q.front();
  68. q.pop();
  69. for(int id = 0; id <K ; id++) {
  70. int v = Next[id][u];
  71. if(!vis[v]) continue;
  72. q.push(v);
  73. int p = fail[u];
  74. while(p && vis[Next[id][p]]==0) {
  75. p = fail[p];
  76. }
  77. fail[v] = Next[id][p];
  78. endMark[v]|=endMark[Next[id][p]];
  79. }
  80. }
  81. }
  82. int main()
  83. {
  84. //ios_base::sync_with_stdio(false);
  85. // cin.tie(NULL);
  86. //init();
  87. for(int i=48;i<=57;i++)ran[i]=i-48;
  88. for(int i=65;i<=90;i++)ran[i]=i-55;
  89. for(int i=97;i<=122;i++)ran[i]=i-61;
  90. char s[135];
  91. int i,j,k,x,y,z,q,t;
  92. //cin>>t;
  93. scanf("%d",&t);
  94. z=t;
  95. while(t--)
  96. {
  97. init();
  98. for(i=0;i<102;i++)
  99. {
  100. for(j=0;j<804;j++)tes[i][j]=-1,dp[i][j]=0.0;
  101. }
  102. //cin>>k;
  103. scanf("%d",&k);
  104. while(k--)
  105. {
  106. //cin>>s;
  107. scanf("%s",s);
  108. //cout<<s<<endl;
  109. string an=s;
  110. Insert(an);
  111. }
  112. build_fail();
  113. //cin>>n;
  114. scanf("%d",&n);
  115. //cout<<n<<endl;
  116. for(i=0;i<n;i++)
  117. {
  118. scanf("%s %lf",s,&ab[i]);
  119. ch[i]=s[0];
  120. // cout<<ch[i]<<endl;
  121. }
  122. //cin>>m;
  123. scanf("%d",&m);
  124. printf("Case #%d: %.6f\n",z-t,cal(0,0));
  125. // cout<<"Case #"<<z-t<<": "<<cal(0,0)<<endl;
  126.  
  127. }
  128. return 0;
  129. }
  130.  
Advertisement
Add Comment
Please, Sign In to add comment