fork download
  1. #include <iostream> // برای cin, cout, endl
  2. #include <vector> // برای std::vector
  3. #include <string> // برای std::string و stoi
  4.  
  5. // نیازی به <utility> یا <sstream> یا <limits> نیست.
  6.  
  7. // نیازی به using namespace std; نیست اگر به این شکل استفاده کنیم
  8. // ولی چون قبلا درخواست کردید، اینجا هم استفاده می کنم:
  9. using namespace std;
  10.  
  11. const int MAX_CACHE_SIZE = 20;
  12.  
  13. int main() {
  14. // افزایش سرعت ورودی/خروجی
  15. ios_base::sync_with_stdio(false);
  16. cin.tie(NULL);
  17.  
  18. // حافظه کش (کوچک): از دو وکتور موازی استفاده می کنیم
  19. vector<int> cache_indices; // نگهداری جایگاه ها
  20. vector<int> cache_main_nums; // نگهداری اعداد اصلی متناظر
  21.  
  22. // حافظه مرکزی (بزرگ): از دو وکتور موازی استفاده می کنیم
  23. vector<int> main_memory_indices; // نگهداری جایگاه ها
  24. vector<int> main_memory_main_nums; // نگهداری اعداد اصلی متناظر
  25.  
  26. string command_str; // برای خواندن "end" و "give"
  27. int val1, val2; // برای خواندن دو عدد در هر خط
  28.  
  29. // --- فاز 1: خواندن داده‌های حافظه مرکزی (حافظه بزرگ) ---
  30. // هر کلمه را به عنوان string می خوانیم تا به "end" برسیم.
  31. while (cin >> command_str) {
  32. if (command_str == "end") {
  33. break; // پایان فاز خواندن داده‌های مرکزی
  34. }
  35.  
  36. // اگر "end" نبود، فرض می کنیم command_str عدد اول (main_num) است.
  37. // آن را به int تبدیل می کنیم.
  38. val1 = stoi(command_str); // main_number
  39.  
  40. // عدد دوم (index_val) را می خوانیم.
  41. cin >> val2; // index_val
  42.  
  43. // ذخیره به صورت {جایگاه, عدد اصلی} برای جستجوی آسان‌تر با ایندکس
  44. main_memory_indices.push_back(val2);
  45. main_memory_main_nums.push_back(val1);
  46. }
  47.  
  48. // --- فاز 2: پردازش درخواست‌های "give" ---
  49. // هر کلمه را می خوانیم تا به "end" دوم برسیم.
  50. while (cin >> command_str) {
  51. if (command_str == "end") {
  52. break; // پایان برنامه
  53. }
  54.  
  55. if (command_str == "give") {
  56. cin >> val1; // val1 اینجا همان جایگاه مورد درخواست است (index_val)
  57.  
  58. bool found_in_cache = false;
  59. int found_number = -1;
  60.  
  61. // **1. جستجو در حافظه کش (حافظه کوچک)**
  62. for (size_t i = 0; i < cache_indices.size(); ++i) {
  63. if (cache_indices[i] == val1) { // مقایسه با جایگاه ذخیره شده
  64. found_in_cache = true;
  65. found_number = cache_main_nums[i]; // عدد اصلی متناظر
  66. break;
  67. }
  68. }
  69.  
  70. if (found_in_cache) {
  71. // **Hit**
  72. cout << "hit with " << found_number << endl;
  73. } else {
  74. // **Miss**: جایگاه در کش نبود
  75. // 2. جستجو در حافظه مرکزی (حافظه بزرگ) برای پیدا کردن عدد اصلی
  76. int main_num_from_memory = -1;
  77. bool found_in_main_memory = false;
  78. for (size_t i = 0; i < main_memory_indices.size(); ++i) {
  79. if (main_memory_indices[i] == val1) { // مقایسه با جایگاه ذخیره شده
  80. main_num_from_memory = main_memory_main_nums[i]; // عدد اصلی متناظر
  81. found_in_main_memory = true;
  82. break;
  83. }
  84. }
  85.  
  86. if (found_in_main_memory) {
  87. cout << "miss with " << main_num_from_memory << endl;
  88.  
  89. // 3. اضافه کردن به کش: FIFO
  90. if (cache_indices.size() == MAX_CACHE_SIZE) {
  91. cache_indices.erase(cache_indices.begin());
  92. cache_main_nums.erase(cache_main_nums.begin());
  93. }
  94. // اضافه کردن عنصر جدید به انتهای کش (به عنوان تازه‌ترین)
  95. cache_indices.push_back(val1);
  96. cache_main_nums.push_back(main_num_from_memory);
  97. }
  98. // اگر در حافظه مرکزی هم پیدا نشد، هیچ خروجی لازم نیست.
  99. }
  100. }
  101. // اگر دستور نه "give" بود و نه "end"، آن خط نادیده گرفته می‌شود.
  102. }
  103.  
  104. // اطمینان از خروج تمام خروجی‌ها قبل از پایان برنامه
  105. cout << flush;
  106.  
  107. return 0;
  108. }
Success #stdin #stdout 0.01s 5320KB
stdin
254458 125631
158434 135979
165572 260466
155028 101855
194976 189469
233682 146048
149847 323000
175312 275522
261628 305207
363691 318210
375828 202137
345097 203488
113665 234838
165446 320239
272296 316819
112937 245679
106387 200214
255857 242996
113941 257290
207214 174134
205112 310674
114048 115449
235521 392331
298687 153791
209850 239150
171801 335028
356089 393004
251393 161181
265566 236875
220886 228352
355980 217155
399692 128306
163881 278419
397863 155189
328605 269703
291118 388651
301296 275996
end
give 112937
give 265566
give 149847
give 235521
give 375828
give 112937
give 114048
give 375828
give 149847
give 254458
give 251393
give 301296
give 397863
give 291118
give 272296
give 301296
give 205112
give 175312
give 301296
give 165446
give 106387
give 298687
give 345097
give 363691
give 298687
end
stdout
Standard output is empty