codeforces ---感染性の手紙

  1. 感染文字
    test1の毎秒の制限時間
    test256メガバイトあたりのメモリ制限
    入力inputstandard
    outputstandard出力
    あなたは長さnの文字列を持っています。残念ながら、その手紙のいくつかは感染性です。より具体的には、文字列内の「a」文字は、隣接する文字に広がる可能性があります。文字列内の「a」文字は、いつでも隣接する文字に「感染」し、それらを「a」文字にすることができます。

ただし、「b」文字は「a」文字の感染の影響を受けないため、「a」文字に変更することはできません。

たとえば、文字列「cabaccabdd」がある場合、文字列の2番目の文字が最初の文字に感染して別の「a」に変わる可能性がありますが、文字列の3番目の文字は「b」であるため感染できませんでした」。

あなたの仕事は、無制限の感染量の後に文字列に存在する可能性のある文字の最大数を決定することです。

たとえば、文字列内の「cabaccabdd」は、6つの「a」文字を持つ無制限の数の感染で「aabaaaabdd」になる可能性があります。

入力入力
の最初の行には、文字列の長さである単一の正の整数n(1 <= n <= 200000)が含まれています。

入力の次の行には文字列が含まれています。

出力
無制限の数の感染後に文字列に存在する可能性のある最大文字数を出力します。

スコアリング
完全な問題:10ポイント

翻訳:
長さnの文字列があります。残念ながら、その手紙のいくつかは伝染性です。より具体的には、文字列内の任意の「a」文字は、任意の隣接する文字に展開できます。文字列内の「a」文字は、いつでも隣接する文字に「感染」し、それらを「a」文字にすることができます。
「b」という単語は「a」という単語の影響を受けないため、「a」という単語になることはできません。
たとえば、文字列「cabaccabdd」がある場合、文字列の2番目の文字は最初の文字に感染して別の「a」に変換できますが、文字列の3番目の文字は「b」であるため感染できません。
あなたの仕事は、無制限の数の感染の後に文字列に存在する可能性のある最大文字数を決定することです。
たとえば、文字列「cabaccabdd」は、6つの「a」文字を含む無制限の数の感染で「aabaaaabdd」になる可能性があります。入力入力
の最初の行には、文字列の長さである正の整数n(1 <= n <= 200000)が含まれています。入力の次の行には、この文字列が含まれています。出力
感染した文字列に存在する可能性のある最大文字数をいくつでも出力します。


INPUT1

15
bbbacxdbxyabxab

output1

9

input2

5
bbbbb

output2

0

input3

5
aabcc

output3

2

結局、10点しか合格しなかったのですが、長い間考えてみたら、test11はどうなるのかわかりません。
テストポイント:

Group main: 0.0 point(s)
    Test 1: OK
    Test 2: OK
    Test 3: OK
    Test 4: OK
    Test 5: OK
    Test 6: OK
    Test 7: OK
    Test 8: OK
    Test 9: OK
    Test 10: OK
    Test 11: WRONG_ANSWER

=
Points: 0.0

エラーコード:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    
    
    int n;
    scanf("%d",&n);
    getchar();
    char s[300001];
    scanf("%s",s);

    int sum=0;
    for(int i=0;i<strlen(s);i++){
    
    
        if(s[i]=='a')sum++;//没在两个b之间单独计数
        if(s[i]=='b'){
    
    //在两个b之间或b到字符串结束之间,其它字符全部感染
            i++;
            int sign=0;
            int count=0;
            while(i<strlen(s)&&s[i]!='b'){
    
    //注意i不能越界,到另一个b结束,之间如果有a全部感染
                if(s[i]=='a'){
    
    
                    sign=1;
                }
                i++;
                count++;
            }
            if(sign)sum+=count;//累加
            i--;
        }
    }
    printf("%d",sum);//输出
    return 0;
}

私は翌朝、自分がどこが間違っているのかを見つけるためだけにアイデアを思いつき、ついにACになりました!
テストポイント:

Group main: 10.0 point(s)
    Test 1: OK
    Test 2: OK
    Test 3: OK
    Test 4: OK
    Test 5: OK
    Test 6: OK
    Test 7: OK
    Test 8: OK
    Test 9: OK
    Test 10: OK
    Test 11: OK
    Test 12: OK
    Test 13: OK
    Test 14: OK
    Test 15: OK
    Test 16: OK
    Test 17: OK
    Test 18: OK
    Test 19: OK
    Test 20: OK
    Test 21: OK
    Test 22: OK
    Test 23: OK
    Test 24: OK
    Test 25: OK
    Test 26: OK
    Test 27: OK
    Test 28: OK
    Test 29: OK
    Test 30: OK
    Test 31: OK
    Test 32: OK
    Test 33: OK
    Test 34: OK
    Test 35: OK
    Test 36: OK
    Test 37: OK
    Test 38: OK
    Test 39: OK
    Test 40: OK
    Test 41: OK

=
Points: 10.0

ACコード:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
int main()
{
    
    
 
    int n;
    scanf("%d",&n);
    getchar();
 
    char s[200001];
    scanf("%s",s);
 
    for(int i=0;i<n;i++){
    
    
        if(s[i]=='a'){
    
    
            int left=i-1;
            int right=i+1;
 
            while(left>=0&&s[left]!='a'&&s[left]!='b'){
    
    
                s[left--]='a';
            }
 
            while(right<=n-1&&s[right]!='a'&&s[right]!='b'){
    
    
                s[right++]='a';
            }
            i=right-1;
        }
    }
    int num=0;
    for(int i=0;i<n;i++){
    
    
        if(s[i]=='a'){
    
    
            num++;
        }
    }
    printf("%d\n",num);
    return 0;
}

おすすめ

転載: blog.csdn.net/timelessx_x/article/details/111770518