Problem:
H : Typing Game / タイピングゲーム
物語
ここからは，タイピング力を鍛える時間です．皆さんは早く正確なタイピングをすることができますか？
Let’s enjoy Typing Game!
問題
タイピングゲームのゲームシステムとして，ジャッジ側が用意したAIの出力に対して対話的に動作するプログラムを作成せよ．
AIは
N
個の文字列をタイプするゲームをプレイする．AIは体力を持っており，その初期値は
H
である．AIは体力がある限り文字のタイプを行う．システムはAIがタイプすべき文字列を提示する．システムはAIがタイプした文字を受け取り，次にタイプすべき文字と一致するか判定する．AIが文字列を
1
つタイプし終えると，システムは次の文字列を提示する．
また，各文字列にはミスタイプの許容回数が定められている．AIのある文字列におけるミスタイプの回数が許容回数を超えてしまうとAIの体力が
1
減り，システムは強制的に次の文字列を提示する．AIの体力が
0
になったらゲームオーバーとなる．最後の文字列において，タイプの成功またはミスタイプ回数の超過が起こった後で，AIの体力が残っていればゲームクリアとなる．
入出力形式
まず，入力が以下の形式で与えられる．
N
H
S_1
T_1
...
S_N
T_N
1行目に文字列の数
N
とAIの体力
H
が空白区切りで与えられる．
続く
N
行には
i
行目に
i
番目の文字列
S_i
と，その文字列に対するミスタイプの許容回数
T_i
が空白区切りで与えられる．
この入力は以下の制約を満たす．
1 ≤ N ≤ 100
1 ≤ H ≤ 10
1 ≤  |S_i|  ≤ 15
S_i
はアルファベット'a'-'z'，または'A'-'Z'のみを含む．
0 ≤ T_i ≤ 20
システムは文字列
S_1
から文字列
S_N
まで順番に処理をする．
i
番目の文字列
S_i
について，AIが
j
文字目までタイプを成功させている場合，以下の処理をする．
システムはAIに対して，
S_i
を出力する．このとき，
S_i
の1文字目から
j
文字目を"_" (アンダースコア) に置き換える．システムが間違った文字列を出力すると，AIは動作を中断しWrong Answerとなる．システムが出力する文字列が S である場合，C/C++での出力例は以下のようになる．
printf("? %s\n", S); fflush(stdout);
AIはシステムの出力を受け取ると，
c
の形式で返答する．
c
はAIがタイプした文字である．
c
はアルファベット'a'-'z'からなる．C/C++での返答の受け取り方の例は以下のようになる．
char c[2];
 scanf("%s", c);
 /*
 char c;
 scanf("%c", &c);
 は空白文字読み込みの仕様上の理由で非推奨です．
 */
システムはAIの出力を受け取るとまずAIがタイプした文字と
S_i
の
j+1
文字目が一致しているか判定する．この判定の際，大文字と小文字は区別しないことに注意せよ．一致しているときは，
j+1
文字目までタイプに成功したとする．ここで
j+1
文字目が
S_i
の最後の文字だった場合，
S_i
のタイプに成功したとし
S_i
の処理を終える．AIがタイプした文字と
S_i
の
j+1
文字目が一致していなければ，
S_i
に対するミスタイプ回数を1だけ増やす．このとき
T_i
を超えていればAIの体力を
1
減らし，
S_i
の処理を終える．
S_i
の処理を終えたとき，AIの体力が
0
であればゲームオーバーとする．ゲームオーバーでなければ
i
が
N
のときゲームクリアとし，そうでなければ
S_{i+1}
の処理に移る．
また，ゲームオーバーの際には"! Game Over"を，ゲームクリアの際には"! Game Clear [タイプ成功率]"を出力せよ．タイプ成功率は (成功タイプ数) / (合計タイプ数)
× 100
で計算される値を小数点以下第2位で切り捨てた値とする．小数点以下第1位が0であっても小数点以下第1位まで出力せよ．C/C++での出力例は以下のようになる．
printf("! Game Over\n"); fflush(stdout);
printf("! Game Clear %.1lf\n", success_type_rate); fflush(stdout);
※printfの書式を"%.1lf"とした場合，出力される浮動小数点数は小数点以下第2位が四捨五入される．このため，タイプ成功率を浮動小数点数として計算し，上記の手法で出力した場合，正しい出力結果が得られないことがあることに注意せよ．
入出力例1
システムの出力
システムへの入力・AIの返答
2 5
ICPC 2
Tsurai 5
? ICPC
i
? _CPC
g
? _CPC
p
? _CPC
c
? __PC
p
? ___C
c
? Tsurai
t
? _surai
s
? __urai
u
? ___rai
r
? ____ai
a
? _____i
i
! Game Clear 83.3
入出力例2
システムの出力
システムへの入力・AIの返答
2 1
ICPC 1
Tsurai 1
? ICPC
i
? _CPC
c
? __PC
o
? __PC
p
? ___C
d
! Game Over

Submitted solutions:

code_snippet: // #define _GLIBCXX_DEBUG // for STL debug (optional)
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <cfloat>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <fstream>
#include <functional>
#include <bitset>
using namespace std;
using ll = long long int;
using int64 = long long int;
 
template<typename T> void chmax(T &a, T b) {a = max(a, b);}
template<typename T> void chmin(T &a, T b) {a = min(a, b);}
template<typename T> void chadd(T &a, T b) {a = a + b;}
 
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
const int INF = 1LL << 29;
const ll LONGINF = 1LL << 60;
const ll MOD = 1000000007LL;

pair<int, int> proceed(string s, int t, int &hp) {
    string lower = s;
    for(auto &c : lower) if('A' <= c and c <= 'Z') c = (char)(c - 'A' + 'a');

    size_t ptr = 0;
    int success = 0, sum = 0;
    while(ptr < s.size() and hp > 0) {
        printf("? %s\n", s.c_str());
        fflush(stdout);

        char c; scanf(" %c", &c);
        if('A' <= c and c <= 'Z') c = (char)(c - 'A' + 'a');
        if(c == lower[ptr]) {
            s[ptr++] = '_';
            success++; sum++;
        }
        else {
            sum++;
            if(--t < 0) {
                hp--;
                break;
            }
        }
    }
    if(hp == 0) return make_pair(-1, -1);
    else return make_pair(success, sum);
}

int main() {
    int N, H; cin >> N >> H;
    vector<string> S(N); vector<int> T(N);
    for(int i=0; i<N; i++) {
        cin >> S[i] >> T[i];
    }
    
    int success = 0, sum = 0;
    for(int i=0; i<N; i++) {
        auto res = proceed(S[i], T[i], H);
        if(res.first < 0) {
            printf("! Game Over\n");
            fflush(stdout);
            return 0;
        }
        success += res.first, sum += res.second;
    }

    int r = success * 1000 / sum;
    string rate = "";
    for(int i=0; i<4 and (i<=1 or r>0); i++) {
        rate += (char)('0' + r%10);
        r /= 10;
        if(i == 0) rate += ".";
    }
    reverse(rate.begin(), rate.end());
    printf("! Game Clear %s\n", rate.c_str());
    return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 3356
final_rank: 15

code_snippet: // #define _GLIBCXX_DEBUG // for STL debug (optional)
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <cfloat>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <fstream>
#include <functional>
#include <bitset>
using namespace std;
using ll = long long int;
using int64 = long long int;
 
template<typename T> void chmax(T &a, T b) {a = max(a, b);}
template<typename T> void chmin(T &a, T b) {a = min(a, b);}
template<typename T> void chadd(T &a, T b) {a = a + b;}
 
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
const int INF = 1LL << 29;
const ll LONGINF = 1LL << 60;
const ll MOD = 1000000007LL;

pair<int, int> proceed(string s, int t, int &hp) {
    string lower = s;
    for(auto &c : lower) if('A' <= c and c <= 'Z') c = (char)(c - 'A' + 'a');

    size_t ptr = 0;
    int success = 0, sum = 0;
    while(ptr < s.size() and hp > 0) {
        printf("? %s\n", s.c_str());
        fflush(stdout);

        char c; scanf(" %c", &c);
        if('A' <= c and c <= 'Z') c = (char)(c - 'A' + 'a');
        if(c == lower[ptr]) {
            s[ptr++] = '_';
            success++; sum++;
        }
        else {
            sum++;
            if(--t < 0) {
                hp--;
                break;
            }
        }
    }
    if(hp == 0) return make_pair(-1, -1);
    else return make_pair(success, sum);
}

int main() {
    int N, H; cin >> N >> H;
    vector<string> S(N); vector<int> T(N);
    for(int i=0; i<N; i++) {
        cin >> S[i] >> T[i];
    }
    
    int success = 0, sum = 0;
    for(int i=0; i<N; i++) {
        auto res = proceed(S[i], T[i], H);
        if(res.first < 0) {
            printf("! Game Over\n");
            fflush(stdout);
            return 0;
        }
        success += res.first, sum += res.second;
    }

    int r = success * 1000 / sum;
    string rate = "";
    for(int i=0; i<3 and (i<=1 or r>0); i++) {
        rate += (char)('0' + r%10);
        r /= 10;
        if(i == 0) rate += ".";
    }
    reverse(rate.begin(), rate.end());
    printf("! Game Clear %s\n", rate.c_str());
    return 0;
}
accuracy: 0.9
time_ms: 20
memory_kb: 3356
final_rank: 18

code_snippet: // #define _GLIBCXX_DEBUG // for STL debug (optional)
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <cfloat>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <fstream>
#include <functional>
#include <bitset>
using namespace std;
using ll = long long int;
using int64 = long long int;
 
template<typename T> void chmax(T &a, T b) {a = max(a, b);}
template<typename T> void chmin(T &a, T b) {a = min(a, b);}
template<typename T> void chadd(T &a, T b) {a = a + b;}
 
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
const int INF = 1LL << 29;
const ll LONGINF = 1LL << 60;
const ll MOD = 1000000007LL;

pair<int, int> proceed(string s, int t, int &hp) {
    string lower = s;
    for(auto &c : lower) if('A' <= c and c <= 'Z') c = (char)(c - 'A' + 'a');

    size_t ptr = 0;
    int success = 0, sum = 0;
    while(ptr < s.size() and hp > 0) {
        printf("? %s\n", s.c_str());
        fflush(stdout);

        char c; scanf(" %c", &c);
        if('A' <= c and c <= 'Z') c = (char)(c - 'A' + 'a');
        if(c == lower[ptr]) {
            s[ptr++] = '_';
            success++; sum++;
        }
        else {
            sum++;
            if(--t < 0) {
                hp--;
                break;
            }
        }
    }
    if(hp == 0) return make_pair(-1, -1);
    else return make_pair(success, sum);
}

int main() {
    int N, H; cin >> N >> H;
    vector<string> S(N); vector<int> T(N);
    for(int i=0; i<N; i++) {
        cin >> S[i] >> T[i];
    }
    
    int success = 0, sum = 0;
    for(int i=0; i<N; i++) {
        auto res = proceed(S[i], T[i], H);
        if(res.first < 0) {
            printf("! Game Over\n");
            fflush(stdout);
            return 0;
        }
        success += res.first, sum += res.second;
    }

    int r = success * 1000 / sum;
    string rate = "";
    for(int i=0; i<3; i++) {
        rate += (char)('0' + r%10);
        r /= 10;
        if(i == 0) rate += ".";
    }
    reverse(rate.begin(), rate.end());
    printf("! Game Clear %s\n", rate.c_str());
    return 0;
}
accuracy: 0.9
time_ms: 20
memory_kb: 3356
final_rank: 18

code_snippet: #include <stdio.h>
#include <cmath>
#include <math.h>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


struct Info{
	char word[16],length,T;
};

void strcpy(char* to,char* str){
	for(int i=0;str[i] != '\0';i++){
		to[i] = str[i];
		to[i+1] = '\0';
	}
}

bool is_match(char left,char right){

	if(left >= 97)left -= 32;
	if(right >= 97)right -= 32;

	return left == right;
}

int main(){

	int N,H;
	scanf("%d %d",&N,&H);

	Info info[N];
	int tmp_length;
	for(int i = 0; i < N; i++){
		scanf("%s %d",info[i].word,&info[i].T);
		for(tmp_length = 0; info[i].word[tmp_length] != '\0'; tmp_length++);
		info[i].length = tmp_length;
	}

	char buf[16];
	strcpy(buf,info[0].word);

	int word_index = 0;
	int loc = 0;

	char resp[2];

	int true_num = 0,wrong_num = 0;

	while(true){

		printf("? %s\n", buf); fflush(stdout);
		scanf("%s",resp);

		if(is_match(buf[loc],resp[0])){
			buf[loc++] = '_';
			true_num++;
			if(loc == info[word_index].length){
				if(word_index == N-1){
					printf("! Game Clear %.1lf\n", floor((double)true_num/(true_num+wrong_num)*1000)/10); fflush(stdout);
					return 0;
				}else{
					word_index++;
					loc = 0;
					strcpy(buf,info[word_index].word);
				}
			}
		}else{
			wrong_num++;
			info[word_index].T--;
			if(info[word_index].T == -1){
				if(H == 1){
					printf("! Game Over\n"); fflush(stdout);
					return 0;
				}else{
					H--;
					if(word_index == N-1){
						printf("! Game Clear %.1lf\n", floor((double)true_num/(true_num+wrong_num)*1000)/10); fflush(stdout);
						return 0;
					}else{
						word_index++;
						loc = 0;
						strcpy(buf,info[word_index].word);
					}
				}
			}
		}
	}

	return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 3344
final_rank: 16

code_snippet: #include <stdio.h>
#include <cmath>
#include <math.h>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


struct Info{
	char word[16],length,T;
};

void strcpy(char* to,char* str){
	for(int i=0;str[i] != '\0';i++){
		to[i] = str[i];
		to[i+1] = '\0';
	}
}

bool is_match(char left,char right){

	if(left >= 97)left -= 32;
	if(right >= 97)right -= 32;

	return left == right;
}

int main(){

	int N,H;
	scanf("%d %d",&N,&H);

	Info info[N];
	int tmp_length;
	for(int i = 0; i < N; i++){
		scanf("%s %d",info[i].word,&info[i].T);
		for(tmp_length = 0; info[i].word[tmp_length] != '\0'; tmp_length++);
		info[i].length = tmp_length;
	}

	char buf[16];
	strcpy(buf,info[0].word);

	int word_index = 0;
	int loc = 0; //?¬????????????´???

	char resp[2];

	int true_num = 0,wrong_num = 0;

	while(true){

		printf("? %s\n", buf); fflush(stdout);
		scanf("%s",resp);

		if(is_match(buf[loc],resp[0])){ //??£?§£
			buf[loc++] = '_';
			true_num++;
			if(loc == info[word_index].length){ //?????????????????????????????´???
				if(word_index == N-1){ //????????????????????´???
					//printf("! Game Clear %.1lf\n", (double)true_num*100.0/(double(true_num+wrong_num))); fflush(stdout);
					printf("! Game Clear %.1lf\n", floor((double)true_num/(true_num+wrong_num)*1000)/10); fflush(stdout);
					return 0;
				}else{ //?¬?????????????
					word_index++;
					loc = 0;
					strcpy(buf,info[word_index].word);
				}
			}
		}else{
			wrong_num++;
			info[word_index].T--;
			if(info[word_index].T == -1){ //??????????????????????????°????¶?????????´???
				if(H == 1){
					printf("! Game Over\n"); fflush(stdout);
					return 0;
				}else{
					H--;
					//?¬?????????????
					if(word_index == N-1){ //????????????????????´???
						//printf("! Game Clear %.1lf\n", (double)true_num*100.0/(double(true_num+wrong_num))); fflush(stdout);
						printf("! Game Clear %.1lf\n", floor((double)true_num/(true_num+wrong_num)*1000)/10); fflush(stdout);
						return 0;
					}else{ //?¬?????????????
						word_index++;
						loc = 0;
						strcpy(buf,info[word_index].word);
					}
				}
			}
		}
	}

	return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 3344
final_rank: 16

code_snippet: #include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define fi first
#define se second
#define dbg(x) cout<<#x" = "<<((x))<<endl
template<class T,class U> ostream& operator<<(ostream& o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream& o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}

int main()
{
    int n,h;
    cin >>n >>h;

    vector<string> s(n);
    vector<int> t(n);
    rep(i,n) cin >>s[i] >>t[i];

    int ss = 0, idx = 0;
    int succ = 0, total = 0;
    int miss = 0;
    while(ss<n)
    {
        cout << "? " << s[ss] << '\n';
        fflush(stdout);

        char c;
        cin >>c;

        char f = s[ss][idx];
        if('A'<=f && f<='Z') f = f-'A'+'a';

        ++total;
        if(f == c)
        {
            s[ss][idx] = '_';

            ++succ;
            ++idx;
        }
        else ++miss;

        if(idx==s[ss].size() || miss>t[ss])
        {
            if(miss>t[ss]) --h;

            ++ss;
            idx = 0;
            miss = 0;
        }

        if(h==0) break;
    }

    if(h>0)
    {
        int R = 1000*succ/total;
        printf("! Game Clear %d.%d\n", R/10, R%10);
        fflush(stdout);
    }
    else
    {
        printf("! Game Over\n");
        fflush(stdout);
    }
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3340
final_rank: 4

code_snippet: /*
 * 2676.cc: Typing Game
 */

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<deque>
#include<algorithm>
#include<numeric>
#include<utility>
#include<complex>
#include<functional>
 
using namespace std;

/* constant */

const int MAX_N = 100;

/* typedef */

/* global variables */

string ss[MAX_N];
int ts[MAX_N];

/* subroutines */

inline char uc(char c) {
  return ((c >= 'A' && c <= 'Z') ? c : c - 'a' + 'A');
}

/* main */

int main() {
  int n, h;
  cin >> n >> h;

  for (int i = 0; i < n; i++) cin >> ss[i] >> ts[i];
  
  int an = 0, tn = 0;

  for (int i = 0; i < n; i++) {
    string &si = ss[i];
    int k = 0, sn = si.size(), m = ts[i];

    while (k < sn && m >= 0) {
      //printf("sn=%d, k=%d, m=%d\n", sn, k, m);
      putchar('?'); putchar(' ');
      for (int j = 0; j < sn; j++) putchar(j < k ? '_' : si[j]);
      putchar('\n');
      cout.flush();

      string s;
      cin >> s;
      tn++;

      if (uc(s[0]) == uc(si[k])) k++, an++;
      else m--;
    }

    if (m < 0 && --h <= 0) {
      puts("! Game Over"); cout.flush();
      return 0;
    }
  }

  printf("! Game Clear %.1lf\n", floor((double)an / tn * 1000) / 10);
  return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 1300
final_rank: 8

code_snippet: #include <iostream>
#include <string>
#include <cstdio>
using namespace std;

int n, h;
string s[100]; int t[100];
int typeNum, acTypeNum;

//r???c???(r>=0,c>=0)????????£?????????????????¨???
//????????£????????????1, ?????£????????????0?????????
int query(int r, int c){
	cout << "? ";
	for( int i = 0; i < c; i++ )
		cout << "_";
	for( int i = c; i < s[r].length(); i++ )
		cout << s[r][i];
	cout << endl;
	cout.flush();
	char result[5];
	cin >> result;
	char x = (result[0] <= 'Z') ? result[0] : result[0] - 'a' + 'A';
	char y = (s[r][c] <= 'Z') ? s[r][c] : s[r][c] - 'a' + 'A';
	if( x == y )
		return 0;
	return 1;
}

//r??????????????£?????????????????¨???
//????????????????¶?????????????1, ???????????¨????????????0?????????
int play(int r){
	int c;
	int damage = 0;
	for( c = 0; c < s[r].length(); ){
		typeNum++;
		int result = query(r, c);
		damage += result;
		if( damage > t[r] )
			return 1;
		c += (!result);
		acTypeNum += (!result);
	}
	return 0;
}

void init(){
	cin >> n >> h;
	for( int i = 0; i < n; i++ )
		cin >> s[i] >> t[i];
	typeNum = 0;
	acTypeNum = 0;
}

void gameClear(){
	//acTypeNum * 100 / typeNum ????°???°???????????¨???????±????????????????
	int ans10 = acTypeNum * 1000 / typeNum;
	double ans = (double)ans10 / 10;
	printf("! Game Clear %.1lf\n", ans);
	fflush(stdout);
}

int main(){
	init();
	for( int i = 0; i < n; i++ ){
		h -= play(i);
		if( h == 0 ){
			cout << "! Game Over" << endl;
			cout.flush();
			return 0;
		}
	}
	gameClear();
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1300
final_rank: 1

code_snippet: #include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<utility>
#include<vector>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<time.h>
#define loop(i,a,b) for(int i=a;i<b;i++) 
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mp make_pair
#define all(in) in.begin(),in.end()
const double PI=acos(-1);
const double EPS=1e-10;
const int inf=1e8;
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
using namespace std;
int main(){
	int n,m;
	cin>>n>>m;
	vector<string>in(n);
	vi c(n);
	rep(i,n)cin>>in[i]>>c[i];
	int co=0;
	int coo=0;
	rep(i,n){
		if(m==0){
			cout<<"! Game Over"<<endl;
			return 0;
		}
		int t=0;
		while(1){
			if(t==in[i].size())break;
			cout<<"? ";
			rep(j,in[i].size())cout<<(j<t?'_':(char)in[i][j]);
			cout<<endl;
			char d,dd;
			cin>>d;
			co++;
			d=toupper(d);
			dd=toupper(in[i][t]);
			if(dd==d){
				t++;
				coo++;
			}else{
				c[i]--;
				if(c[i]<0){
					m--;
					break;
				}
			}
		}
	}
	if(m==0){
		cout<<"! Game Over"<<endl;
		return 0;
	}
	double q=coo*100.0/co;
	q=(int)(q*10);
	q/=10;
	printf("! Game Clear %0.1f\n",q);
}
accuracy: 1
time_ms: 30
memory_kb: 1304
final_rank: 13

code_snippet: #include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<utility>
#include<vector>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<time.h>
#define loop(i,a,b) for(int i=a;i<b;i++) 
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mp make_pair
#define all(in) in.begin(),in.end()
const double PI=acos(-1);
const double EPS=1e-10;
const int inf=1e8;
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
using namespace std;
int main(){
	int n,m;
	cin>>n>>m;
	vector<string>in(n);
	vi c(n);
	rep(i,n)cin>>in[i]>>c[i];
	int co=0;
	int coo=0;
	rep(i,n){
		if(m==0){
			cout<<"! Game Over"<<endl;
			return 0;
		}
		int t=0;
		while(1){
			if(t==in[i].size())break;
			cout<<"? ";
			rep(j,in[i].size())cout<<(j<t?'_':(char)in[i][j]);
			cout<<endl;
			char d,dd;
			cin>>d;
			co++;
			d=toupper(d);
			dd=toupper(in[i][t]);
			if(dd==d){
				t++;
				coo++;
			}else{
				c[i]--;
				if(c[i]<0){
					m--;
					break;
				}
			}
		}
	}
	double q=coo*100.0/co;
	q=(int)(q*10);
	q/=10;
	printf("! Game Clear %0.1f\n",q);
}
accuracy: 0.84
time_ms: 30
memory_kb: 1300
final_rank: 20

code_snippet: #include <iostream>
#include <cstdio>
#include <string>
#include <vector>

using namespace std;
typedef pair<string, int> P;

void solve()
{
	int N, H;
	cin >> N >> H;
	vector<P> input(N);
	for (int i = 0; i < N; ++i)
	{
		cin >> input[i].first >> input[i].second;
	}
	int mistake = 0;
	int count = 0;
	int word = 0;
	int pos = 0;
	while (word < N)
	{
		cout << "? " << input[word].first << endl;
		string s;
		cin >> s;
		++count;
		if (input[word].first[pos] == s[0] ||
			input[word].first[pos] == s[0] + 32 || 
			input[word].first[pos] == s[0] - 32)
		{
			input[word].first[pos] = '_';
			++pos;
			if (pos == input[word].first.size())
			{
				++word;
				pos = 0;
			}
		}
		else
		{
			++mistake;
			if (input[word].second == 0)
			{
				--H;
				if (H == 0)
				{
					cout << "! Game Over" << endl;
					fflush(stdout);
					return;
				}
				else
				{
					++word;
					pos = 0;
				}
			}
			else
			{
				--input[word].second;
			}
		}
	}
	printf("! Game Clear %.1lf\n", (int)((double)(count - mistake) / count * 1000) / 10.0);
	fflush(stdout);
}

int main()
{
	solve();
	return(0);
}
accuracy: 1
time_ms: 30
memory_kb: 1300
final_rank: 8

code_snippet: #include<bits/stdc++.h>
using namespace std;string S[999],a;int P,M[999],O[999],c,C,n,m,i;main(){cin>>n>>m;for(i=0;i<n;i++){cin>>S[i]>>O[i];}for(i=0;i<n;i++){P=0;while(P!=S[i].size()){cout<<"? "<<S[i]<<endl;cin>>a;C++;if(tolower(a[0])==tolower(S[i][P])){ S[i][P]='_';P++;c++; }else{M[i]++;if(M[i]>O[i]){m--;break;}}}if(m<=0){ cout<<"! Game Over"<<endl;return 0; }}cout<<fixed<<setprecision(1)<<"! Game Clear "<<(double)((int)(1000*c/C)/10.0)<<endl;}
accuracy: 1
time_ms: 10
memory_kb: 3364
final_rank: 6

code_snippet: #include<bits/stdc++.h>
using namespace std;
string S[999],a;
int P,M[999],O[999],c,C,n,m,i;
int main(){
	cin>>n>>m;
	for(i=0;i<n;i++){
		cin>>S[i]>>O[i];
	}
	for(i=0;i<n;i++){
		P=0;
		while(P!=S[i].size()){
			cout<<"? "<<S[i]<<endl;
			cin>>a;
			C++;
			if(tolower(a[0])==tolower(S[i][P])){ 
				S[i][P]='_';P++;c++; 
			}
			else{
				M[i]++;
				if(M[i]>O[i]){
					m--;break;
				}
			}
		}
		if(m<=0){ 
			cout<<"! Game Over"<<endl;return 0; 
		}
	}
	cout<<fixed<<setprecision(1)<<"! Game Clear "<<(double)((int)(1000*c/C)/10.0)<<endl;
}
accuracy: 1
time_ms: 10
memory_kb: 1308
final_rank: 3

code_snippet: #include<bits/stdc++.h>
using namespace std;
string S[999],a;
int pass,miss[999],over[999],misscnt,totalcnt,n,m,i;
int main(){
	cin>>n>>m;
	for(i=0;i<n;i++){
		cin>>S[i]>>over[i];
	}
	for(i=0;i<n;i++){
		pass=0;
		while(pass!=S[i].size()){
			cout<<"? "<<S[i]<<endl;
			cin>>a;
			totalcnt++;
			if(tolower(a[0])==tolower(S[i][pass])){ 
				S[i][pass]='_';pass++;misscnt++; 
			}
			else{
				miss[i]++;
				if(miss[i]>over[i]){
					m--;break;
				}
			}
		}
		if(m<=0){ 
			cout<<"! Game Over"<<endl;return 0; 
		}
	}
	cout<<fixed<<setprecision(1)<<"! Game Clear "<<(double)((int)(1000*misscnt/totalcnt)/10.0)<<endl;
}
accuracy: 1
time_ms: 10
memory_kb: 1304
final_rank: 2

code_snippet: #include<iostream>
#include<string>
#include<cmath>
#include<cstdio>
#include<iomanip>
#include<cctype>
using namespace std;

#define MAX_N 10000

string S[MAX_N];
int pass;
int miss[MAX_N];
int over[MAX_N];
int misscnt, totalcnt;
int n, m;
string a;

int main() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> S[i] >> over[i];
	}
	for (int i = 0; i < n; i++) {
		pass = 0;
		while (pass != S[i].size()) {
			cout << "? ";
			cout << S[i] << endl;
			cin >> a;
			totalcnt++;
			if (tolower(a[0]) == tolower(S[i][pass])) { 
				S[i][pass] = '_'; pass++; misscnt++; 
			}
			else {
				miss[i]++;
				if (miss[i] > over[i]) {
					m--; break;
				}
			}
		}
		if (m <= 0) { 
			cout << "! Game Over" << endl; return 0; 
		}
	}
	cout << fixed << setprecision(1) << "! Game Clear " << (double)((int)(1000 * misscnt / totalcnt) / 10.0) << endl;
	return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 1372
final_rank: 14

code_snippet: #include <cctype>
#include <cstdio>
#include <cstring>

char S[100][16]; int N, H, Q, R, T[100], P[100];

int main()
{
    scanf("%d %d", &N, &H);
    
    for(int i = 0; i < N; i++)
    {
        scanf("%s %d", S[i], &T[i]);
    }
    
    char F[2];
    
    for(int i = 0; i < N; i++)
    {
        int ptr = 0;
        
        while(ptr != strlen(S[i]))
        {
            printf("? %s\n", S[i]); fflush(stdout);
            
            scanf("%s", F); R++;
            
            if(tolower(S[i][ptr]) == tolower(F[0]))
            {
                S[i][ptr] = '_'; ptr++; Q++;
            }
            else
            {
                P[i]++;
                
                if(P[i] > T[i])
                {
                    H--; break;
                }
            }
        }
        
        if(H == 0)
        {
            printf("! Game Over\n"); return 0;
        }
    }
    
    int r = Q * 1000 / R;
    
    printf("! Game Clear %d.%d\n", r / 10, r % 10);
    
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3372
final_rank: 8

code_snippet: #include <cctype>
#include <cstdio>
#include <cstring>

using namespace std;

char S[100][16]; int N, H, Q, R, T[100], P[100];

int main()
{
    scanf("%d %d", &N, &H);
    
    for(int i = 0; i < N; i++)
    {
        scanf("%s %d", S[i], &T[i]);
    }
    
    char F[2];
    
    for(int i = 0; i < N; i++)
    {
        int ptr = 0;
        
        while(ptr != strlen(S[i]))
        {
            printf("? %s\n", S[i]); fflush(stdout);
            
            scanf("%s", F); R++;
            
            if(tolower(S[i][ptr]) == tolower(F[0]))
            {
                S[i][ptr] = '_'; ptr++; Q++;
            }
            else
            {
                P[i]++;
                
                if(P[i] > T[i])
                {
                    H--; break;
                }
            }
        }
        
        if(H == 0)
        {
            printf("! Game Over\n"); return 0;
        }
    }
    
    int r = Q * 1000 / R;
    
    printf("! Game Clear %d.%d\n", r / 10, r % 10);
    
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3372
final_rank: 8

code_snippet: #include <cctype>
#include <cstdio>
#include <cstring>

using namespace std;

char S[111][22]; int N, H, Q, R, T[111], P[111];

int main()
{
    scanf("%d %d", &N, &H);
    
    for(int i = 0; i < N; i++)
    {
        scanf("%s %d", S[i], &T[i]);
    }
    
    char F[2];
    
    for(int i = 0; i < N; i++)
    {
        int ptr = 0;
        
        while(ptr != strlen(S[i]))
        {
            printf("? %s\n", S[i]); fflush(stdout);
            
            scanf("%s", F); R++;
            
            if(tolower(S[i][ptr]) == tolower(F[0]))
            {
                S[i][ptr] = '_'; ptr++; Q++;
            }
            else
            {
                P[i]++;
                
                if(P[i] > T[i])
                {
                    H--; break;
                }
            }
        }
        
        if(H == 0)
        {
            printf("! Game Over\n"); return 0;
        }
    }
    
    int r = Q * 1000 / R;
    
    printf("! Game Clear %d.%d\n", r / 10, r % 10);
    
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3372
final_rank: 8

code_snippet: #include <cctype>
#include <cstdio>
#include <cstring>

using namespace std;

char S[111][22]; int N, H, Q, R, T[111], P[111];

int main()
{
    scanf("%d %d", &N, &H);
    
    for(int i = 0; i < N; i++)
    {
        scanf("%s %d", S[i], &T[i]);
    }
    
    char F[2];
    
    for(int i = 0; i < N; i++)
    {
        int ptr = 0;
        
        while(ptr != strlen(S[i]))
        {
            printf("? %s\n", S[i]); fflush(stdout);
            
            scanf("%s", F); R++;
            
            if(tolower(S[i][ptr]) == tolower(F[0]))
            {
                S[i][ptr] = '_'; ptr++; Q++;
            }
            else
            {
                P[i]++;
                
                if(P[i] > T[i])
                {
                    H--; break;
                }
            }
        }
                   
        if(H <= 0)
        {
            printf("! Game Over\n"); return 0;
        }
    }
    
    int r = Q * 1000 / R;
    
    printf("! Game Clear %d.%d\n", r / 10, r % 10);
    
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3368
final_rank: 7

code_snippet: #include <cctype>
#include <string>
#include <vector>
#include <iostream>

using namespace std;

int main()
{
    int N, H, Q = 0, R = 0; cin >> N >> H;
    
    vector<string> S(N);
    
    vector<int> T(N);
    vector<int> P(N, 0);
    
    for(int i = 0; i < N; i++)
    {
        cin >> S[i] >> T[i];
    }
    
    string F;
    
    for(int i = 0; i < N; i++)
    {
        int ptr = 0;
        
        while(ptr != S[i].size())
        {
            cout << "? " << S[i] << endl;
            
            cin >> F; R++;
            
            if(tolower(S[i][ptr]) == tolower(F[0]))
            {
                S[i][ptr] = '_'; ptr++; Q++;
            }
            else
            {
                P[i]++;
                
                if(P[i] > T[i])
                {
                    H--; break;
                }
            }
        }
                   
        if(H <= 0)
        {
            cout << "! Game Over" << endl; return 0;
        }
    }
    
    int r = Q * 1000 / R;
    
    printf("! Game Clear %d.%d\n", r / 10, r % 10);
    
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3360
final_rank: 5