codeforces 372 Complete the Word(双指针)

codeforces 372 Complete the Word(双指针)

题链

题意:给出一个字符串,其中'?'代表这个字符是可变的,要求一个连续的26位长的串,其中每个字母都只出现一次

#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long
#define inf 1000000000
using namespace std;
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
const int N=5e4+10;
char a[N];
int book[30];
int main()
{
    while(~scanf("%s",a))
    {
        int i=0,j=0,len=strlen(a);
        int u,v;
        memset(book,0,sizeof(book));
        for(j=0;j<len;j++)
        {
            if(j-i==26) break;
            if(a[j]=='?') continue;
            else if(book[a[j]-'A'])
            {
                while(i<j&&a[i]!=a[j]){
                        if(a[i]=='?'){
                            i++;
                            continue;
                        }
                        else book[a[i]-'A']=0;
                        i++;
                }
                if(i!=j){
                    i++;
                }
            }
            else book[a[j]-'A']=1;
        }
        if(j-i!=26){
            puts("-1");
            continue;
        }
        int kk=0;
        memset(book,0,sizeof(book));
        for(int k=i;k<j;k++){
             if(a[k]!='?') book[a[k]-'A']=1;
        }
        for(int k=i;k<j;k++){
             if(a[k]=='?'){
                for(;kk<26;kk++){
                    if(!book[kk]){
                        a[k]=kk+'A';
                        book[kk]=1;
                        break;
                    }
                }
            }
        }
        for(int k=0;k<len;k++){
            if(a[k]=='?'){
                a[k]='A';
            }
        }
        printf("%s
",a);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zsyacm666666/p/6705555.html