指定されたタイプの新しいタイプの文字を検索します
タイトル説明
新しいタイプの文字の定義は次のとおりです
。1。新しいタイプの文字は、長さが1または2の文字列です。
- 式は、「e」などの小文字のみにすることができます。「Ab」などの大文字+小文字にすることもできます。「DC」などの大文字+大文字にすることもできます。
文字列strが与えられると、strはいくつかの新しいタイプの文字の正しい組み合わせの結果である必要があります。たとえば、「eaCCBi」は新しいタイプの文字「e」、「a」、「CC」、「Bi」で構成されています。str内の位置を表す整数kが与えられます。k番目の位置に新しいタイプの文字を返してください。
説明を入力してください:
入力には2行が含まれます。最初の行には2つの整数n、k(1≤n≤105、0≤k≤n− 1)n、k(1 \ leq n \ leq 10 ^ 5,0 \ leq k \ leq n-1)n 、k (1≤n≤1 05、0≤k≤n−1 )、nは文字列strの長さを表し、2行目には文字列strを表す文字列が含まれます。
出力の説明:
出力には、k位置で指定された新しいタイプの文字が含まれます。
例1
入る
11 7
aaABCDEcBCg
出力
Ec
回答:
文字列シミュレーション。基本的な解決策は、前から後ろにトラバースし、位置kに到達したときにそれがどの文字であるかを知ることです。別の新しいアプローチがあります。位置k-1から開始して左に移動し、最初の小文字で停止し、大文字のnumの数を数えます。
- numが奇数の場合、新しいタイプの文字はstr [k-1、k]である必要があります。
- str [k]が大文字の場合、新しいタイプの文字はstr [k、k +1]です。
- それ以外の場合、新しいタイプの文字はstr [k]です。
注:タイトルのkは0から始まります。
コード:
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100010;
char s[N];
int n, k;
int main(void) {
scanf("%d%d", &n, &k);
scanf("%s", s);
int ans = 0;
for (int i = k - 1; i >= 0; --i) {
if (s[i] >= 'a' && s[i] <= 'z') break;
++ans;
}
if (ans & 1) printf("%c%c\n", s[k - 1], s[k]);
else if (s[k] >= 'A' && s[k] <= 'Z') printf("%c%c\n", s[k], s[k + 1]);
else printf("%c\n", s[k]);
return 0;
}