文系ギャルが0から始める競技プログラミング#20
Intro
この記事は不定期連載です。
↓最初の一本はこちら↓
文系ギャルが0から始める競技プログラミング#0
↓直前の記事はこちら↓
文系ギャルが0から始める競技プログラミング#19
・ABC072B
引き続きけんちょんさんの記事より出題です。
今日は文字列を扱うB問題2本!
問題文
英小文字からなる文字列sが与えられます。
前から数えて奇数文字目だけ抜き出して作った文字列を出力してください。
ただし、文字列の先頭の文字を1文字目とします。
制約
sの各文字は英小文字
1≤|s|≤10^5
入力
入力は以下の形式で標準入力から与えられる。
s
出力
前から数えて奇数文字目だけ抜き出して作った文字列を出力せよ。
― B - OddString
ゴールを整理します。
奇数文字目だけを抜き出して(≒偶数文字目は消して)出力すれば優勝です。
string型では足していけば文字列に追加されていくので、
指定された文字だけを後ろに付け足していくだけでよさそうです。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(){
string s;
cin >> s;
size_t size = s.length();
string ans;
for(int i=0;i<size;i++){
if(i%2==0){
ans = ans+s[i];
}
}
cout << ans << endl;
return 0;
}
あっさり優勝☆やっぱ天才でしょ〜〜〜〜〜!
・ABC053B
問題文
すぬけくんは文字列sの連続した一部分(部分文字列という)を取り出して先頭がAであり末尾がZであるような文字列を作ることにしました。
すぬけくんが作ることのできる文字列の最大の長さを求めてください。
なお,sには先頭がAであり末尾がZであるような部分文字列が必ず存在することが保証されます。
制約
1≦|s|≦200,000
sは英大文字のみからなる
sには先頭がAであり末尾がZであるような部分文字列が必ず存在する
入力
入力は以下の形式で標準入力から与えられる。
s
出力
答えを出力せよ。
― B - A to Z String
ゴールを整理します。
最初のAと最後のZを見つけ、間の文字数をカウントすれば良いことに気付きます。
Aの位置をA、Zの位置をZとすることにします。
string s;
cin >> s;
size_t size = s.length();
int A = 0;
int Z = 0;
Aは見つけたらループを抜けたいので、breakを使います。
for(int i=0;i<size;i++){
if(s[i]=='A'){
A = i;
break;
}
}
Zは最後のを拾いたいので、最後まで探しきります。
(逆から探しても良かったかもなあ)
for(int i=0;i<size;i++){
if(s[i]=='Z'){
Z = i;
}
}
ZからAを引き、0から始まっているので1を足したら優勝です。
cout << Z-A+1 << endl;
return 0;
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
string s;
cin >> s;
size_t size = s.length();
int A = 0;
int Z = 0;
for(int i=0;i<size;i++){
if(s[i]=='A'){
A = i;
break;
}
}
for(int i=0;i<size;i++){
if(s[i]=='Z'){
Z = i;
}
}
cout << Z-A+1 << endl;
return 0;
}
だいぶ文字列の扱いは慣れてきて、さっくり解けるようになりました!!
B問題は意味不明な問題文でないかぎり行けそう?
そろそろ競プロ始めて1ヶ月になります。
進捗出せたかどうか…。
これからも頑張って続けていきます!!!!!!!!!
Outro
#21に続く!(不定期連載です。)
これは成功と挫折を繰り返し、
タピオカ片手に難問を解く、
ギャルプログラマが生まれるまでの物語である…。