Hi mọi người, em có đang làm bài tập sau: https://www.spoj.com/PTIT/problems/P145PROI/
Về cơ bản thì em duyệt for của chỉ số i và search chỉ số j nhỏ nhất (i < j) sao cho đoạn [i, j] an toàn. Nếu an toàn chỉ việc cộng kết quả với (n - j) và dịch “pointer” ở bên trái lên (trong trường hợp này là left).
Kỹ thuật này gần giống như two pointers, và đây là code cài của em:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
int num = 0, up = 0, low = 0, left = 0, sum = 0;
// numeral, uppercase, lowercase, left
cin >> str;
int n = str.size();
for (int i = 0; i < n; ++i) {
// xét kiểu ký tự uppercase, lowercase hay numeral để tăng loại biến tương ứng
if ('a' <= str[i] && str[i] <= 'z') ++low;
else if ('A' <= str[i] && str[i] <= 'Z') ++up;
else ++num;
// nếu xâu con trong đoạn [left, i] đã thỏa mãn các điều kiện: Tối thiểu 6 ký tự, có ký tự lowercase, uppercase, numeral
if (num > 0 && low > 0 && up > 0 && i - left >= 5) {
sum += (n - i); // là số lượng các xâu thỏa mãn [left, x] với x >= i
// tiến hành dịch chuyển biến 'left' (left pointer)
if ('a' <= str[left] && str[left] <= 'z') --low;
else if ('A' <= str[left] && str[left] <= 'Z') --up;
else --num;
++left;
// tiến hành lùi biến 'i' (lần lặp sau sẽ tính lại)
if ('a' <= str[i] && str[i] <= 'z') --low;
else if ('A' <= str[i] && str[i] <= 'Z') --up;
else --num;
--i;
}
}
cout << sum;
return 0;
}
Em submit chấm được khoảng 24 tests thì bị WA ở test #24.
Em vẫn chưa biết bug ở chỗ nào, nên post lên đây nhờ mọi người giúp đỡ ạ!
Em xin cảm ơn trước!
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?