传送门:hihoCoder #1086 Browser Caching
实现 LRU(Least Recently Used) Cache 即可
参考:http://www.cs.uml.edu/~jlu1/doc/codes/lruCache.html
Solution:
1 #include <iostream> 2 #include <vector> 3 #include <map> 4 using namespace std; 5 6 struct Entry 7 { 8 string key; 9 Entry *prev; 10 Entry *next; 11 }; 12 13 class LRUCache 14 { 15 map<string, Entry*> mapping; 16 vector<Entry*> free_entries; 17 Entry* head; 18 Entry* tail; 19 Entry *entries; 20 21 public: 22 LRUCache(size_t size) { 23 entries = new Entry[size]; 24 for (int i = 0; i < size; ++i) 25 free_entries.push_back(entries + i); 26 head = new Entry; 27 tail = new Entry; 28 head->prev = NULL; 29 head->next = tail; 30 tail->next = NULL; 31 tail->prev = head; 32 } 33 34 ~LRUCache() { 35 delete head; 36 delete tail; 37 delete[] entries; 38 } 39 40 void put(string key) { 41 Entry *node = mapping[key]; 42 if (node) { 43 detach(node); 44 attach(node); 45 } 46 else { 47 if (free_entries.empty()) { 48 node = tail->prev; 49 detach(node); 50 mapping.erase(node->key); 51 node->key = key; 52 mapping[key] = node; 53 attach(node); 54 } 55 else { 56 node = free_entries.back(); 57 free_entries.pop_back(); 58 node->key = key; 59 mapping[key] = node; 60 attach(node); 61 } 62 } 63 } 64 65 string query(string key) { 66 Entry* node = mapping[key]; 67 put(key); 68 if (node) { 69 return "Cache"; 70 } 71 else { 72 return "Internet"; 73 } 74 } 75 76 private: 77 void detach(Entry *node) 78 { 79 node->prev->next = node->next; 80 node->next->prev = node->prev; 81 } 82 83 void attach(Entry *node) 84 { 85 node->next = head->next; 86 node->prev = head; 87 head->next = node; 88 node->next->prev = node; 89 } 90 91 }; 92 93 94 int main() 95 { 96 int N, M; 97 cin >> N >> M; 98 LRUCache cache(M); 99 while (N--) { 100 string url; 101 cin >> url; 102 cout << cache.query(url) << endl; 103 } 104 }