hdu 5672(尺取法)
生活随笔
收集整理的這篇文章主要介紹了
hdu 5672(尺取法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:有一個10<=長度<=1000000的字符串,僅由小寫字母組成。求有多少子串,包含至少k(1<= k <= 26)個不同的字母。
解題思路:利用尺取法求符合條件的臨界區間,即找到包含k個不同字母的子串區間。這里的關鍵是如何找區間內的不同字母個數,其實可以用計數數組,且其有效范圍是在兩個指針之間的字符串。當指針移動時,計數數組要做相應調整。
<span style="font-size:14px;">#include<iostream> #include<cstdio> #include<cstring> using namespace std;const int maxn = 1e6+5; char str[maxn]; int c[26],len,k;int getsum() {int cnt = 0;for(int i = 0; i < 26; i++)if(c[i] != 0)cnt++;return cnt; }int main() {int t;scanf("%d",&t);while(t--){getchar();scanf("%s",str+1);scanf("%d",&k);len = strlen(str+1);memset(c,0,sizeof(c));int r = 1;__int64 ans = 0;for(int i = 1; i <= len; i++){c[str[i]-'a']++;while(getsum() == k){c[str[r]-'a']--;r++;}ans += r - 1;}printf("%I64d\n",ans);}return 0; }</span>
總結
以上是生活随笔為你收集整理的hdu 5672(尺取法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 3061(尺取法)
- 下一篇: poj 1696(极角排序)