CodeChef-LUCKYSTR : Little Elephant and Strings

問題概要

長さ50以下の文字列がK+N個(K,N<50)与えられる。後ろのN個の各文字列に対して、長さが47以上であるか最初のK個を部分文字列として含むかどうか判定する問題。

解法

小さいので愚直にやって間に合う。

acceptされたコード

#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
using namespace std;

int N, K;
vector<string> as, bs;

void init(){
	scanf("%d %d ", &K, &N);
	char buf[100];
	for(int i=0; i<K; ++i){
		scanf(" %s ", buf);
		if(buf[strlen(buf)-1] != '4' && buf[strlen(buf)-1] != '7'){
			buf[strlen(buf)-1] = '\0';
		}
		as.push_back(string(buf));
	}

	for(int i=0; i<N; ++i){
		scanf(" %s ", buf);
		if(buf[strlen(buf)-1] != '4' && buf[strlen(buf)-1] != '7'){
			buf[strlen(buf)-1] = '\0';
		}
		bs.push_back(string(buf));
	}
}

bool sub(string str){
	if((int)str.length() >= 47){
		return true;
	}
	for(int i=0; i<K; ++i){
		for(int j=0; j<(int)str.length(); ++j){
			if(str.substr(j, as[i].length()) == as[i]){
				return true;
			}
		}
	}

	return false;
}

void solve(){
	for(int i=0; i<N; ++i){
		puts(sub(bs[i]) ? "Good" : "Bad");
	}
}

int main(){
	init();
	solve();

	return 0;
}