fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define ll long long
  5. #define ld long double
  6. #define fastio \
  7.   ios_base::sync_with_stdio(false); \
  8.   cin.tie(NULL);
  9.  
  10. void filein()
  11. {
  12. #ifndef ONLINE_JUDGE
  13. freopen("input.txt", "r", stdin);
  14. freopen("output.txt", "w", stdout);
  15. #endif
  16. }
  17.  
  18. struct Request
  19. {
  20. long timestamp;
  21. string id;
  22. double amount;
  23. string cardNumber;
  24. string merchantName;
  25. bool status;
  26.  
  27. Request(long timestamp, string id, double amount, string cardNumber, string merchantName)
  28. {
  29. this->timestamp = timestamp;
  30. this->id = id;
  31. this->amount = amount;
  32. this->cardNumber = cardNumber;
  33. this->merchantName = merchantName;
  34. this->status = true;
  35. }
  36. };
  37.  
  38. struct Rule
  39. {
  40. long timestamp;
  41. unordered_map<string, string> field;
  42.  
  43. Rule(long timestamp, string fieldKey, string value)
  44. {
  45. field[fieldKey] = value;
  46. this->timestamp = timestamp;
  47. }
  48. };
  49.  
  50. vector<string> parseRequestString(string request, char delimiter)
  51. {
  52. int len = request.length();
  53. vector<string> splits;
  54. int i;
  55. string current = "";
  56. for (i = 0; i < len; i++)
  57. {
  58. if (request[i] == delimiter)
  59. {
  60. splits.push_back(current);
  61. current = "";
  62. }
  63. else
  64. {
  65. current += request[i];
  66. }
  67. }
  68. if (current.length())
  69. {
  70. splits.push_back(current);
  71. }
  72. return splits;
  73. }
  74.  
  75. void sortRequests(vector<Request> &requests)
  76. {
  77.  
  78. auto cmp = [](Request &r1, Request &r2)
  79. {
  80. return r1.timestamp < r2.timestamp;
  81. };
  82.  
  83. sort(requests.begin(), requests.end(), cmp);
  84. }
  85.  
  86. void printOutput(vector<Request> &requests)
  87. {
  88.  
  89. for (auto request : requests)
  90. {
  91. cout << request.timestamp << " " << request.id << " " << request.amount << " "
  92. << "APPROVE" << endl;
  93. }
  94. }
  95.  
  96. bool isAuthorized(Request request, vector<Rule> rules)
  97. {
  98.  
  99. for (auto rule : rules)
  100. {
  101. if (rule.timestamp > request.timestamp)
  102. {
  103. continue;
  104. }
  105.  
  106. if (rule.field.find("merchant") != rule.field.end())
  107. {
  108. if (request.merchantName == rule.field["merchant"])
  109. {
  110. return false;
  111. }
  112. }
  113.  
  114. if (rule.field.find("cardnumber") != rule.field.end())
  115. {
  116. if (request.cardNumber == rule.field["cardnumber"])
  117. {
  118. return false;
  119. }
  120. }
  121. }
  122.  
  123. return true;
  124. }
  125.  
  126. bool isAuthorizedPostProcessing(Request request, vector<Rule> rules)
  127. {
  128.  
  129. for (auto rule : rules)
  130. {
  131.  
  132. if (rule.field.find("merchant") != rule.field.end())
  133. {
  134. if (request.merchantName == rule.field["merchant"])
  135. {
  136. return false;
  137. }
  138. }
  139.  
  140. if (rule.field.find("card_number") != rule.field.end())
  141. {
  142. if (request.cardNumber == rule.field["card_number"])
  143. {
  144. return false;
  145. }
  146. }
  147. }
  148.  
  149. return true;
  150. }
  151.  
  152. void printWithStatus(Request request, string status)
  153. {
  154.  
  155. cout << request.timestamp << " " << request.id << " " << request.amount << " "
  156. << status << endl;
  157. }
  158.  
  159. void solve(vector<string> requests, vector<string> rules)
  160. {
  161.  
  162. // # 5,R1,5.60,4242424242424242,bobs_burgers
  163. // # 10,R2,500.00,4242111111111111,a_corp
  164.  
  165. // # 5 R1 5.60 APPROVE
  166. // # 10 R2 500.00 APPROVE
  167.  
  168. // # time,field,value
  169. // # 1,merchant,bobs_burgers
  170. // # 20,card_number,4242111111111111
  171.  
  172. // # 5 R1 5.60 REJECT
  173. // # 10 R2 500.00 APPROVE
  174.  
  175. vector<Request> requestsObjects;
  176. vector<Rule> ruleObjects;
  177.  
  178. for (auto request : requests)
  179. {
  180.  
  181. vector<string> splits = parseRequestString(request, ',');
  182. long timestamp = stol(splits[0]);
  183. string id = splits[1];
  184. double amount = stod(splits[2]);
  185. string cardNumber = splits[3];
  186. string merchantName = splits[4];
  187.  
  188. requestsObjects.push_back(Request(timestamp, id, amount, cardNumber, merchantName));
  189. }
  190.  
  191. for (auto rule : rules)
  192. {
  193. vector<string> ruleSplits = parseRequestString(rule, ',');
  194. long timestamp = stol(ruleSplits[0]);
  195. string key = ruleSplits[1];
  196. string value = ruleSplits[2];
  197.  
  198. ruleObjects.push_back(Rule(timestamp, key, value));
  199. }
  200.  
  201. sortRequests(requestsObjects);
  202. double fraudAmount = 0;
  203.  
  204. for (auto &requestObject : requestsObjects)
  205. {
  206. if (isAuthorized(requestObject, ruleObjects))
  207. {
  208. printWithStatus(requestObject, "APPROVE");
  209. requestObject.status = true;
  210. }
  211. else
  212. {
  213. printWithStatus(requestObject, "REJECT");
  214. requestObject.status = false;
  215. }
  216. }
  217.  
  218. // Post processing
  219. for(auto requestObject : requestsObjects) {
  220. bool status = isAuthorizedPostProcessing(requestObject,ruleObjects);
  221. // cout<<status<<" "<<requestObject.id<<" "<<requestObject.status<<" "<<requestObject.amount<<" "<<requestObject.cardNumber<<endl;
  222. if(status == false && requestObject.status == true){
  223. fraudAmount+= requestObject.amount;
  224. }
  225. }
  226.  
  227. cout<<"Fraud amount : "<<fraudAmount<<endl;
  228. }
  229.  
  230. int main()
  231. {
  232. filein();
  233. fastio;
  234. // int t;
  235. // cin>>t ;
  236. vector<string> requests;
  237. vector<string> rules;
  238. requests.push_back("5,R1,5.60,4242424242424242,bobs_burgers");
  239. requests.push_back("10,R2,500.00,4242111111111111,a_corp");
  240.  
  241. rules.push_back("1,merchant,bobs_burgers");
  242. rules.push_back("20,card_number,4242111111111112");
  243.  
  244. solve(requests,rules);
  245.  
  246. return 0;
  247. }
Success #stdin #stdout 0.01s 5300KB
stdin
Standard input is empty
stdout
5 R1 5.6 REJECT
10 R2 500 APPROVE
Fraud amount : 0