এই মুহুর্তে আমরা একটা সাইটে ইউজার একাউন্ট রেজিস্টার সিস্টেম নিয়ে কাজ করতে চাচ্ছি। সিস্টেমের বেসিক কাজটা খুবই সোজা। প্রত্যেকবার একজন ইউজার রেজিস্টার করতে চাইলে, আমরা সিস্টেম ডাটাবেজ চেক করে দেখবো এ নামে কোন ইউজার আছে কিনা। যদি না থাকে, তাহলে ওই ইউজার রেজিস্টার হবেন এবং আমরা OK মেসেজ শো করবো। যদি নামটি আগেই আমাদের ডাটাবেজে থাকে, মানে এই নামে আগেই কেউ একজন রেজিস্টার করে ফেলেন সেক্ষেত্রে নতুন নামের ফরম্যাট হবে এরকম- ইন্টিজার ভেল্যু (1, 2, 3… ) ওই নামের শেষে যোগ হবে এবং ইউজারকে এই নামে রেজিস্ট্রেশন করার জন্য রিকমেন্ডেশন পাঠাবো। ধরা যাক, karim
রেজিস্টেশন রিকেউয়েস্ট পাঠিয়েছে, এখন করিম নামে আগের কেউ না পাঠালে আমরা OK রিপ্লাই শো করবো; যদি karim নামে আগে কেউ থেকে থাকে তাহলে karim1
নামটি রিকমেন্ড করবো। আরেকজনও যদি karim
নামটি চায়, তাহলে karim2
নামটি রিকমেন্ড করবো।
এই প্রব্লেম সলভ করার বেসিক চিন্তাটা হলো প্রতিটি আইটারেশনে যে স্ট্রিংটি পাবো তার মান ইনক্রিজ করে যেতে থাকবো। প্রথমে $0$, তারপর $1$, তারপর $2$… যদি ওই স্ট্রিং এর মান $0$ শুন্য হয় তাহলে আউটপুট দেখাবো OK, যদি $1$ হয় তাহলে আনসার হবে string1
, যদি $2$ হয় আনসার হবে string2
, এভাবেই হিশেব চলতে থাকবে। আমাদেরকে একইসাথে স্ট্রিং এবং ইন্টিজার দুটো ডাটা নিয়েই কাজ করতে হবে।
এই কাজটি যদি আমাদের বেসিক ডাটা স্ট্রাকচার দিয়ে করতে যাই তাহলে খুব যন্ত্রণাকর। কিন্তু স্টান্ডার্ড টেম্পলেট লাইব্রেরী জানা থাকলে, এটি দুতিন লাইনের একটা প্রোগ্রাম মাত্র। এই প্রব্লেমে আমরা STL
এর ম্যাপ ইউজ করবো। STL map একই সাথে ন্যুনতম দুটো ডাটা নিয়ে কাজ করতে পারে। সহজভাবে ম্যাপকে তুমি এভাবে চিন্তা করতে পারো, ম্যাপ হচ্ছে একটা অ্যারে, যেটার ইনডেক্স যেকোন কিছুই হতে পারে, আর সেটাতে যেটা ইচ্ছে সেটাই রাখা যেতে পারে! তাহলে আমাদের এই প্রব্লেমটির জন্য string হবে আমাদের ইনডেক্স আর সেখানে আমরা ইন্টিজার ভেল্যু কাউন্ট করে রাখবো।
1
2
3
4
5
6
map<string, int> mp; // general form
mp[first] = 1; //request 1 time
mp[first] = 2; //request 2 times
mp[second] = 1;
mp[third] = 1;
mp[third] = 2;
আশা করি পরিষ্কার বুঝা যাচ্ছে। প্রথমে সব ইন্ডেক্সের মান হবে $0$। তারপর ইন্ডেক্সের মান $1$ করে বাড়তে থাকবে, যতবার ইউজার ওই স্পেসেফিক নামের রিকুয়েস্ট দিবে ততবার।