給定長度10~1,000,000的小寫字母串S,查詢包含至少k(1≤k≤26)種不同字符的子串數量。T≤10組測試。
維護窗口[l, r)內字符頻次cnt[26]及不同字符數diff。
對每個右端點r,擴展窗口直到diff ≥ k。此時以r為右端點的合法子串數 = n - r(因為進一步擴展右端點仍合法)。累加答案後,移動左端點l縮小窗口,更新cnt和diff,繼續尋找下一個合法窗口。
cnt[c]記錄字符出現次數(而非單純bool),移除左端點時僅當cnt[c]==1才diff--。long long(%lld)。scanf(\"%s\", s)讀取char陣列。= k) {
ans += n - r; // 所有以r為右端點的子串均合法
if (--cnt[s[l]-'a'] == 0) --diff;
++l;
}
}
printf("%lld\n", ans);
}
return 0;
}
經典「至少k種不同元素」子串計數問題,雙指針單調性完美適用。注意頻次數組而非布爾標記、左端點不回退、長長整型輸出三大細節。