hdu5672 尺取

因为没有初始化ans搞了一晚上

还是尺取,枚举所有l 然后寻找对应满足条件的r,这个串可以被后面所有的串包含,所以每个l 的贡献就是len-r+1

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
    int t,k,len,r,sum;
    ll ans=0;
    char s[1000005];
    int vis[1000];
    scanf("%d",&t);
    while(t--){
        memset(vis,0,sizeof vis);
        scanf("%s%d",s,&k);
        len=strlen(s);
        sum=r=0;
        for(int l=0;l<len;l++){
            if(l) {
                int tmp=s[l-1];
                vis[tmp]--;
                if(vis[tmp]==0) sum--;
            } 
                
            while(1){
                if(sum==k || r==len) break;
                int tmp=s[r];
                vis[tmp]++;
                if(vis[tmp]==1) sum++;
                r++; 
            }
            if(sum==k) ans+=len-r+1;
            else break;
        }
        printf("%lld\n",ans);
    }
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/10152817.html