#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int longestAdjacentValidSubstring(const string& s, int k) {
int n = s.length();
if (n == 0) return 0;
// dp[i] = largest valid substring ending at index "i"
// Initialized to 1 because a single character is always a valid substring of length 1
vector<int> dp(n, 1);
for (int i = 1; i < n; ++i) {
// if(abs(s[i-1]-s[i])<=k)
if (abs(s[i - 1] - s[i]) <= k) {
// dp[i] = 1 + dp[i-1]
dp[i] = 1 + dp[i - 1];
} else {
// dp[i] = 1
dp[i] = 1;
}
}
// -> Max(dp[1],dp[2],dp[3],................dp[n])
// Note: C++ uses 0-based indexing, so this finds the max from dp[0] to dp[n-1]
return *max_element(dp.begin(), dp.end());
}
int main() {
// Example test cases
string s1 = "abdfa";
int k1 = 2;
cout << "String: " << s1 << ", k = " << k1 << "\n";
cout << "Max adjacent valid substring length: " << longestAdjacentValidSubstring(s1, k1) << "\n\n";
string s2 = "adg";
int k2 = 1;
cout << "String: " << s2 << ", k = " << k2 << "\n";
cout << "Max adjacent valid substring length: " << longestAdjacentValidSubstring(s2, k2) << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGxvbmdlc3RBZGphY2VudFZhbGlkU3Vic3RyaW5nKGNvbnN0IHN0cmluZyYgcywgaW50IGspIHsKICAgIGludCBuID0gcy5sZW5ndGgoKTsKICAgIGlmIChuID09IDApIHJldHVybiAwOwoKICAgIC8vIGRwW2ldID0gbGFyZ2VzdCB2YWxpZCBzdWJzdHJpbmcgZW5kaW5nIGF0IGluZGV4ICJpIgogICAgLy8gSW5pdGlhbGl6ZWQgdG8gMSBiZWNhdXNlIGEgc2luZ2xlIGNoYXJhY3RlciBpcyBhbHdheXMgYSB2YWxpZCBzdWJzdHJpbmcgb2YgbGVuZ3RoIDEKICAgIHZlY3RvcjxpbnQ+IGRwKG4sIDEpOyAKCiAgICBmb3IgKGludCBpID0gMTsgaSA8IG47ICsraSkgewogICAgICAgIC8vIGlmKGFicyhzW2ktMV0tc1tpXSk8PWspCiAgICAgICAgaWYgKGFicyhzW2kgLSAxXSAtIHNbaV0pIDw9IGspIHsKICAgICAgICAgICAgLy8gZHBbaV0gPSAxICsgZHBbaS0xXQogICAgICAgICAgICBkcFtpXSA9IDEgKyBkcFtpIC0gMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gZHBbaV0gPSAxCiAgICAgICAgICAgIGRwW2ldID0gMTsKICAgICAgICB9CiAgICB9CgogICAgLy8gLT4gTWF4KGRwWzFdLGRwWzJdLGRwWzNdLC4uLi4uLi4uLi4uLi4uLi5kcFtuXSkKICAgIC8vIE5vdGU6IEMrKyB1c2VzIDAtYmFzZWQgaW5kZXhpbmcsIHNvIHRoaXMgZmluZHMgdGhlIG1heCBmcm9tIGRwWzBdIHRvIGRwW24tMV0KICAgIHJldHVybiAqbWF4X2VsZW1lbnQoZHAuYmVnaW4oKSwgZHAuZW5kKCkpOwp9CgppbnQgbWFpbigpIHsKICAgIC8vIEV4YW1wbGUgdGVzdCBjYXNlcwogICAgc3RyaW5nIHMxID0gImFiZGZhIjsKICAgIGludCBrMSA9IDI7CiAgICBjb3V0IDw8ICJTdHJpbmc6ICIgPDwgczEgPDwgIiwgayA9ICIgPDwgazEgPDwgIlxuIjsKICAgIGNvdXQgPDwgIk1heCBhZGphY2VudCB2YWxpZCBzdWJzdHJpbmcgbGVuZ3RoOiAiIDw8IGxvbmdlc3RBZGphY2VudFZhbGlkU3Vic3RyaW5nKHMxLCBrMSkgPDwgIlxuXG4iOwoKICAgIHN0cmluZyBzMiA9ICJhZGciOwogICAgaW50IGsyID0gMTsKICAgIGNvdXQgPDwgIlN0cmluZzogIiA8PCBzMiA8PCAiLCBrID0gIiA8PCBrMiA8PCAiXG4iOwogICAgY291dCA8PCAiTWF4IGFkamFjZW50IHZhbGlkIHN1YnN0cmluZyBsZW5ndGg6ICIgPDwgbG9uZ2VzdEFkamFjZW50VmFsaWRTdWJzdHJpbmcoczIsIGsyKSA8PCAiXG4iOwoKICAgIHJldHVybiAwOwp9