Codeforces Round #253 (Div. 2)

http://codeforces.com/contest/443

だめだった oo--- 1570 (-44), expert Rank: 401

A

パーサの手書きもいいけどstringstreamが楽?

int main(){
    int n;
    string s;
    while (getline(cin,s)){
        rep(i,s.size()){
            if (isalpha(s[i])) continue;
            s[i] = ' ';
        }
        stringstream ss(s);
        string k;
        set<string> ans;
        while (ss >> k){
            ans.insert(k);
        }

        cout << ans.size() << endl;
    }
}

B

tandem repeat(日本語でなんて言うんだろう)とは結局、長さが偶数で前半と後半が等しい文字列。前半をt1、後半をt2とする。t1を入力文字列のi番目から始まる長さwの文字列、t2i+w番目から始まる長さwの文字列として、t1=t2となるように取れる場合にwを更新していった。

int main(){
    string s;
    int n;
    while (cin >> s >> n){
        int ans = 0;
        string t1, t2;
        for (int i = 0; i < s.size(); i++){
            for (int w = 1; w <= s.size() + n; w++){
                if (i + w < s.size()){ // t1がはみ出ない
                    if (i + w + w < s.size()){ // t2がはみ出る
                        t1 = s.substr(i, w);
                        t2 = s.substr(i + w, w);
                        if (t1 == t2){
                            ans = max<int>(ans, w);
                        }
                    }
                    else { // t2がはみ出ない
                        t1 = s.substr(i, w);
                        t2 = s.substr(i + w);
                        bool f = t1.substr(0, t2.size()) == t2;
                        if (f && i + w + w <= s.size() + n){
                            ans = max<int>(ans, w);
                        }
                    }
                }
                else { // t1がはみ出る(t2も必ずはみ出る)
                    t1 = s.substr(i);
                    if (w + w <= t1.size() + n){
                        ans = max<int>(ans, w);
                    }
                }
                //cout << t1 << " " << t2 << " " << ans << endl;
            }
        }
        cout << ans*2 << endl;
    }
}

C以降のあらすじ

Cの実装意外と面倒くさそうだなあ…他の問題見るか →DがDPっぽいなあ(大嘘) →Dにはまる →D分からなさそうだしEも無理っぽい →C間に合わない →絶望