BestCoder Round #81(div.2) 1004 String(동적 계획)

제목 링크: BestCoder Round #81(div.2) 1003 String
제목의 뜻
중국어 문제는 링크가 있어서 붙이지 않겠습니다.
사고의 방향
기점 i를 매거하면 k개의 서로 다른 자모의 최소 하표 j에 도달할 수 있으며 이때 자열len-j개가 있다.모든 시작점의 값을 더하면 결과가 된다.
코드
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define LL long long

const int MOD = 1000000007;

char str[1000009];
int num[27];

int get_cnt()
{
    int cnt = 0;
    for(int i=0; i<26; i++)
        cnt += num[i]==0?0:1;
    return cnt;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int k;
        memset(num, 0, sizeof(num));
        scanf("%s%d", str, &k);
        int len = strlen(str);
        LL ans = 0;
        int j = -1;
        bool flag = false;
        for(int i=0; i<len; i++)
        {

            while(get_cnt() < k)
            {
                j++;
                if(j == len)
                {
                    flag = true;
                    break;
                }
                num[str[j]-'a']++;
            }

            if(flag)
                break;
            ans += len-j;
            num[str[i]-'a']--;
        }
        printf("%lld
"
, ans); } return 0; }

좋은 웹페이지 즐겨찾기