結果
| 問題 |
No.145 yukiover
|
| コンテスト | |
| ユーザー |
codershifth
|
| 提出日時 | 2015-08-16 14:25:40 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 2,272 bytes |
| コンパイル時間 | 1,321 ms |
| コンパイル使用メモリ | 165,264 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-07-18 09:51:06 |
| 合計ジャッジ時間 | 2,376 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 20 |
ソースコード
#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
#define FOR(i,a,b) for(int (i)=(a);i<(b);i++)
#define REP(i,n) FOR(i,0,n)
#define RANGE(vec) (vec).begin(),(vec).end()
using namespace std;
const string target = "yuki@";
class Yukiover {
public:
vector<int> cnt;
bool dfs(int d) {
// yuki* ができなかったら終了
if (d == (int)target.size()+1) // d==5
return false;
// yuki がすでにできている場合(d==4)は c = '@' となる
// このとき '@' < 'a' なので使用可能な文字が一つでもあれば条件クリアになる
char c = target[d];
// 使用できる文字が残っているならそれを使用して
// yuki が構築できないか試してみる
if (cnt[c])
{
--cnt[c]; // c を消費してみてためす
if (dfs(d+1))
return true;
++cnt[c]; // ダメだったので戻す
}
++c; // y,u,k,i のうち使用できる文字がないのでそれ以降の文字で試してみる
for (; c <= 'z'; ++c)
{
if (cnt[c])
{
--cnt[c];
return true;
}
}
return false;
}
// y > u > k > i と降順なので
// u... < yuki となってしまうため
// yuki*, yuk*, yu*, y*, * を順次構築すれと考えてよい。
void solve(void) {
int N;
string S;
cin>>N>>S;
cnt.resize('z'+1,0); // 記述を簡単にするため 256 くらい多めに確保しておく
// 各文字の使用可能回数を数えておく
for (auto c : S)
++cnt[c];
int n = 0;
// dfs で探索
// この中で順次 yuki*, yuk*, yu*, y*, * を作っていく
while (dfs(0))
++n;
cout<<n<<endl;
}
};
#if 1
int main(int argc, char *argv[])
{
ios::sync_with_stdio(false);
auto obj = new Yukiover();
obj->solve();
delete obj;
return 0;
}
#endif
codershifth