สำหรับโจทย์ข้อนี้ หากทดลองเลือกทั้งหมด ช่วงที่เป็นไปได้พร้อมนับจำนวน "อ้า" กับ "โอ้" จะต้องใช้เวลามากถึง ซึ่งไม่ทันสำหรับกรณีที่ มีค่ามากถึง
หากเรากำหนดให้คำว่า "โอ้" (O) มีค่าเท่ากับ และคำว่า "อ้า" (R) มีค่าเท่ากับ จะสังเกตได้ว่า ช่วงที่มีคำว่า "โอ้" เป็นจำนวน เท่าของจำนวนคำว่า "อ้า" ที่เราต้องการนั้นจะหาผลรวมได้เท่ากับ พอดี
ถ้าเรานิยาม Prefix Sum โดย คือค่าของคำที่ ตามนิยามข้างต้น โจทย์ของเราจะเป็นการหาช่วง () ที่สมการ
เป็นจริง และทำให้ค่า (ความยาวของช่วง) มากที่สุดที่เป็นไปได้
ดังนั้น เราสามารถใช้ขั้นตอนวิธีดังต่อไปนี้ในการแก้โจทย์
- สร้าง
map
หรือunordered_map
ขึ้นมาเพื่อให้ เมื่อกำหนดค่า ใด ๆ จะหาค่า ที่น้อยที่สุดที่ทำให้ ได้อย่างรวดเร็ว - ไล่ โดยนำค่า ไปเก็บใน
map
/unordered_map
ถ้าไม่เคยเจอ prefix sum เท่ากับ มาก่อน แต่ถ้าเคยเจอแล้ว ให้ตรวจสอบว่าค่า ที่น้อยที่สุดคืออะไร แล้วเก็บคำตอบ (ความยาวของช่วง) ที่มากที่สุดไว้
Time Complexity: หรือ เมื่อใช้ map
หรือ unordered_map
ตามลำดับ
Space Complexity:
Implementation
ในภาษา C++:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 10; int n, k; char s[N]; unordered_map<ll, int> f; int main() { scanf("%d%d %s", &n, &k, s + 1); ll qs = 0; int mx = 0; for (int i = 1; i <= n; ++i) { if (s[i] == 'R') qs -= k; else ++qs; if (f[qs] == 0 && qs != 0) f[qs] = i; else mx = max(mx, i - f[qs]); } printf("%d", mx); return 0; }