結果
| 問題 |
No.204 ゴールデン・ウィーク(2)
|
| コンテスト | |
| ユーザー |
ty70
|
| 提出日時 | 2015-05-28 16:09:34 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,113 bytes |
| コンパイル時間 | 990 ms |
| コンパイル使用メモリ | 97,656 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-13 13:20:03 |
| 合計ジャッジ時間 | 2,186 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 40 WA * 6 |
ソースコード
#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm> // require sort next_permutation count __gcd reverse etc.
#include <cstdlib> // require abs exit atof atoi
#include <cstdio> // require scanf printf
#include <functional>
#include <numeric> // require accumulate
#include <cmath> // require fabs
#include <climits>
#include <limits>
#include <cfloat>
#include <iomanip> // require setw
#include <sstream> // require stringstream
#include <cstring> // require memset
#include <cctype> // require tolower, toupper
#include <fstream> // require freopen
#include <ctime> // require srand
#define rep(i,n) for(int i=0;i<(n);i++)
#define ALL(A) A.begin(), A.end()
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int MAX_V = 50;
int par[MAX_V]; // 親
// n 要素で初期化
void uf_init (int n ){
rep (i, n ){
par[i] = i;
} // end rep
}
// 木の根を求める
int uf_find (int x ){
if (par[x] == x )
return x;
else
return par[x] = uf_find (par[x] );
}
// x と y の属する集合を併合
void uf_unite (int x, int y ){
x = uf_find (x );
y = uf_find (y );
if (x == y ){
return;
}else
if (x < y ){
par[y] = x;
}else{ // if x > y
par[x] = y;
} // end if
}
bool uf_same (int x, int y ){
return uf_find (x) == uf_find (y );
}
int uf_size(void ){
set<int> res; res.clear();
rep (i, MAX_V ){
res.insert (uf_find(par[i] ) );
} // end rep
set<int>::iterator it = res.begin();
return res.size();
}
const string weekly = "xxxxxxx";
int cnt[50];
int max_holiday (string s ){
memset (cnt, 0, sizeof (cnt ) );
cnt[0] = (s[0] == 'o' );
int n = s.length();
for (int i = 1; i < n; i++ ){
if (s[i] == 'o' )
cnt[i] = cnt[i-1] + 1;
else
cnt[i] = 0;
} // end for
int res = 0;
rep (i, n ) res = max (res, cnt[i] );
return res;
}
/*
OK!
xxxxooooxxxx
--oooooo----
NG!
xxxxooooxxxx
---oooooo---
OK!
ooooxxxxoooo
---oooooo---
NG!
xxxxooooxoxx
---ooooooo--
×が連続している部分は OK。
×が離れて存在する部分は NG。
*/
bool is_concated (string s ){
int n = s.length();
if (n == 1 ) return true;
uf_init (n );
for (int i = 1; i < n; i++ ){
if (s[i-1] == s[i] )
uf_unite (i-1, i );
} // end for
int res = uf_size();
// cerr << res << endl;
return (res == 1 );
}
string replace (string s, string t, int p ){
string u = "";
if (!is_concated (s.substr(p, t.length() ) ) ) return u;
u = s;
rep (i, t.length() ) u[p+i] = t[i];
return u;
}
int main()
{
ios_base::sync_with_stdio(0);
int D; cin >> D;
string c1; cin >> c1;
string c2; cin >> c2;
string s = "";
rep (i, 2 ) s += weekly;
s += c1; s += c2;
rep (i, 2 ) s += weekly;
string t = "";
rep (i, D ) t += 'o';
int res = 0;
rep (i, s.length() - t.length() + 1 ){
string u = replace (s, t, i );
bool ok = (!u.empty() );
int curr = 0;
if (ok ){
// cerr << u << endl;
curr = max_holiday (u );
} // end if
res = max (res, curr );
} // end rep
cout << res << endl;
return 0;
}
ty70