# 575 라운드 Codeforces (사업부. 3) D1 + D2. RGB 하위 문자열 (쉬운 버전) D2. RGB 하위 문자열 (하드 버전) (생각, 열거, 접두사)

D1. RGB 서브 스트링 (쉬운 버전)
TEST2 초마다의 시간 제한
test256 메가 바이트 당 메모리 제한
입력 inputstandard
outputstandard 출력
쉽고 하드 버전 사이의 차이점은 입력의 크기이다.

당신은 n 개의 문자로 구성된 문자열의 주어집니다, 각 문자는 'G'또는 'B', 'R'입니다.

또한 정수 k에 주어집니다. 당신의 작업은 변경 후 s의 문자열이며, 또한 무한 문자열의 부분 문자열 길이 k의 문자열이 될 수 있도록 초기 문자열의 문자의 최소 수를 변경하는 것입니다 "RGBRGBRGB ..." .

A | | = BI + | A | -1 내가되도록 A1 = BI, A2 = BI + 1, A3 = BI + 2, ..., A A 양수가 존재하는 경우, B A 문자열 A는 문자열의 문자열이다. "GR", "RGR"및 "GGG"가 아닌 예를 들어, 문자열 "GBRG", "B", "BR"은 무한 문자열 "RGBRGBRGB ..."의 문자열이다.

당신은 Q 독립적 인 쿼리에 응답해야합니다.

입력
쿼리 수 - 입력의 첫 번째 라인은 하나의 정수 Q (1≤q≤2000)을 포함한다. 그런 다음 Q 쿼리은 다음과 같습니다.

문자열의 길이와 문자열의 길이 - 질의의 첫 번째 라인은 두 정수 N과 K (1≤k≤n≤2000)을 포함한다.

조회의 두 번째 라인은 n 개의 문자 'R', 'G'및 'B'로 구성된 문자열 S를 포함한다.

모든 쿼리를 통해 N의 합이 2000 (Σn≤2000)를 초과하지 않는 것을 보장한다.

출력
각 쿼리 인쇄 한 정수 용 - 초기 문자열의에서 변경해야하는 최소 문자 수 있도록 또한 무한 문자열 "RGBRGBRGB의 서브 스트링의 길이 k의 문자열이있을 것이다 변경 한 후 ... ".


inputCopy
3
5 2
BGGGG
5 3
RBRGR
5 5
BBBRR
outputCopy
1
0
3

첫 번째 예는, 사용자가 'R'에 첫 문자를 변경 문자열 "RG"를 얻거나 'R'에 대한 두 번째 문자를 변경할 수 있고 "BR"를 얻거나 'B'로, 제 4 또는 제 5 문자를 변경하고 "GB"를 얻었다.

두 번째 예에서, 문자열은 "BRG"이다.

질문의 의미 :
두 가지 질문하지만 서로 다른 데이터 범위, 그래서 무한 RGBRGBRGB입니다 최소한의 변화가 문자열 길이 k의 문자열을 할 수있는 문자 물어, 설명 당신에게 문자열과 K를 제공하기 위해 함께 넣어 ***** 긴 서브 스트링?
아이디어 :

D1 : 시간 복잡도는 (N * k)를 수행 O 명백 할 것이다

우리는 먼저 R, G 세 RGB 문자열 길이 (k)를 생성, B는 처음이다.

그런 다음 O (N-로 이동 K) 모든 문자열 길이 K 연속 문자열의 O를 열거 (. 3 K)를 GBR 문자 하위 문자열과 세 문자열을 스캔의 다른 번호를,

다른 주제의 최소한의 답입니다 유지합니다.

D2 : O (N + K)의 시간 복잡도가 수용된다.

그럼 세 개의 RGB 길이 n의 문자열, 각각의 일치를 구성하고 문자열 str을 계속 할 수 있습니다.

우리는 (1) 상이한 [I]의 다른 i 번째 문자열 RGB 스트링을 유지하는 경우 대전은 0과 동일하다.

그 후, [I]와 프리픽스 길이 k의 문자열의 처리를 통해 O (N)와 RGB 스위프 이상의 스트링의 서로 다른 값들의 수를 찾는.

두 번호 : 제 D1이되고, D2는 불허

자세한 내용은 코드를 참조하십시오 :

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
char s[maxn];
int main()
{
    //freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
    //freopen("D:\\common_text\code_stream\\out.txt","w",stdout);
 
    int q;
    int n,k;
    gbtb;
    cin>>q;
    while(q--)
    {
        cin>>n>>k;
        cin>>s;
        string str1,str2,str3;
        str1="";
        str2="";
        str3="";
        for(int i=0;i<k;++i)
        {
            if(i%3==0)
            {
                str1.pb('R');
            }else if((i%3)==1)
            {
                str1.pb('G');
            }
            else
            {
                str1.pb('B');
            }
        }
        for(int i=0;i<k;++i)
        {
            if(i%3==0)
            {
                str2.pb('G');
            }else if((i%3)==1)
            {
                str2.pb('B');
            }
            else
            {
                str2.pb('R');
            }
        }
        for(int i=0;i<k;++i)
        {
            if(i%3==0)
            {
                str3.pb('B');
            }else if((i%3)==1)
            {
                str3.pb('R');
            }
            else
            {
                str3.pb('G');
            }
        }
        int ans=inf;
        for(int i=0;i+k-1<n;++i)
        {
            int cnt=0;
            for(int j=i;j<=i+k-1;++j)
            {
                if(s[j]!=str1[j-i])
                {
                    cnt++;
                }
            }
            ans=min(ans,cnt);
            cnt=0;
            for(int j=i;j<=i+k-1;++j)
            {
                if(s[j]!=str2[j-i])
                {
                    cnt++;
                }
            }
            ans=min(ans,cnt);
            cnt=0;
            for(int j=i;j<=i+k-1;++j)
            {
                if(s[j]!=str3[j-i])
                {
                    cnt++;
                }
            }
            ans=min(ans,cnt);
            cnt=0;
        }
        cout<<ans<<endl;
    }
 
 
    return 0;
}
 
inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}
 
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
char s[maxn];
int a[maxn];
int sum[maxn];
int main()
{
    //freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
    //freopen("D:\\common_text\code_stream\\out.txt","w",stdout);
 
    int q;
    int n,k;
    gbtb;
    cin>>q;
    while(q--)
    {
        cin>>n>>k;
        cin>>s;
        string str1,str2,str3;
        str1="";
        str2="";
        str3="";
        for(int i=0;i<n;++i)
        {
            if(i%3==0)
            {
                str1.pb('R');
            }else if((i%3)==1)
            {
                str1.pb('G');
            }
            else
            {
                str1.pb('B');
            }
        }
        for(int i=0;i<n;++i)
        {
            if(i%3==0)
            {
                str2.pb('G');
            }else if((i%3)==1)
            {
                str2.pb('B');
            }
            else
            {
                str2.pb('R');
            }
        }
        for(int i=0;i<n;++i)
        {
            if(i%3==0)
            {
                str3.pb('B');
            }else if((i%3)==1)
            {
                str3.pb('R');
            }
            else
            {
                str3.pb('G');
            }
        }
        int ans=inf;
        rep(i,0,n)
        {
            if(s[i]!=str1[i])
            {
                a[i]=1;
            }else
            {
                a[i]=0;
            }
        }
        sum[0]=a[0];
        rep(i,1,n)
        {
            sum[i]=sum[i-1]+a[i];
        }
        for(int i=k-1;i<n;++i)
        {
            int temp=0;
            if(i-k>=0)
                temp=sum[i-k];
            ans=min(ans,sum[i]-temp);
        }
        rep(i,0,n)
        {
            if(s[i]!=str2[i])
            {
                a[i]=1;
            }else
            {
                a[i]=0;
            }
        }
        sum[0]=a[0];
        rep(i,1,n)
        {
            sum[i]=sum[i-1]+a[i];
        }
        for(int i=k-1;i<n;++i)
        {
            int temp=0;
            if(i-k>=0)
                temp=sum[i-k];
            ans=min(ans,sum[i]-temp);
        }
        rep(i,0,n)
        {
            if(s[i]!=str3[i])
            {
                a[i]=1;
            }else
            {
                a[i]=0;
            }
        }
        sum[0]=a[0];
        rep(i,1,n)
        {
            sum[i]=sum[i-1]+a[i];
        }
        for(int i=k-1;i<n;++i)
        {
            int temp=0;
            if(i-k>=0)
                temp=sum[i-k];
            ans=min(ans,sum[i]-temp);
        }
        cout<<ans<<endl;
    }
 
 
    return 0;
}
 
inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}

추천

출처www.cnblogs.com/qieqiemin/p/11247870.html