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
の文字列、t2
がi+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間に合わない →絶望