NoiminのNoise

競技プログラミング (多め) とWeb (たまに) ,自然言語処理 (ブログではまだ)。数式の書き方を一気に KaTeX に変えようとして記事を全削除してインポートし直すなどしたので,過去にブックマークされた記事は URL が変わってしまっている可能性があります…….

みんなのプロコン 予選 C - 検索

問題概要

N個の文字列が与えられる. {A_1, A_2, \cdots, A_K$番目の文字列の接頭辞となっており,かつ<img src=

ソースコード

#include<iostream>
#include<string>
#include<vector>
#include<set>

#define rep(n) for(int i=0;i<n;i++)
#define repp(j, n) for(int j=0;j<n;j++)
#define reppp(i, m, n) for(int i=m;i<=n;i++)
#define all(c) c.begin(), c.end()
#define rall(c) c.rbegin(), c.rend()
 
using namespace std;

int main(){
    ios::sync_with_stdio(0); cin.tie(0);

    int n, k;
    cin >> n >> k;
    if(n == k){
        cout  << endl;
        return 0;
    }
    set<int> ok;
    vector<string> s(n);
    rep(k){
        int tmp;
        cin >> tmp;
        ok.insert(tmp-1);
    }
    rep(n) cin >> s[i];
    string keyword = s[*(ok.begin())];
    int key_length = (int)keyword.length();

    for(int i: ok){
        int common_length = 0;
        while(common_length < min(key_length, (int)s[i].length())){
            if(keyword[common_length] == s[i][common_length]){
                common_length++;
            }else{
                break;
            }
        }
        keyword = keyword.substr(0, common_length);
        key_length = (int)keyword.length();
    }

    vector<int> ng_length;
    rep(n){
        if(ok.find(i) != ok.end()) continue;
        int common_length = 0;
        while(common_length < min(key_length, (int)s[i].length())){
            if(keyword[common_length] == s[i][common_length]){
                common_length++;
            }else{
                break;
            }
        }
        ng_length.push_back(common_length);
    }
    
    int ans_length = *max_element(all(ng_length)) + 1;
    if(ans_length <= key_length)
        cout << keyword.substr(0, ans_length) << endl;
    else
        cout << -1 << endl;

    return 0;
}

所感

今年度も開催が決定したYahoo!主催のプロコンの,去年の予選の問題. 解けたあとに振り返ってみれば決して難しい問題ではないし,解法もかなりストレートなものだが14WAも出してしまった. 本選のAも解けていないし,私はみんプロの問題が苦手なのかもしれない(?)