結果
| 問題 |
No.295 hel__world
|
| コンテスト | |
| ユーザー |
sigma425
|
| 提出日時 | 2017-09-15 01:13:36 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 404 ms / 5,000 ms |
| コード長 | 2,351 bytes |
| コンパイル時間 | 1,795 ms |
| コンパイル使用メモリ | 171,916 KB |
| 実行使用メモリ | 27,840 KB |
| 最終ジャッジ日時 | 2024-11-07 21:09:13 |
| 合計ジャッジ時間 | 7,269 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 53 |
ソースコード
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define all(c) c.begin(),c.end()
#define pb push_back
#define fs first
#define sc second
#define show(x) cout << #x << " = " << x << endl
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
using namespace std;
template<class S,class T> ostream& operator<<(ostream& o,const pair<S,T> &p){return o<<"("<<p.fs<<","<<p.sc<<")";}
template<class T> ostream& operator<<(ostream& o,const vector<T> &vc){o<<"sz = "<<vc.size()<<endl<<"[";for(const T& v:vc) o<<v<<",";o<<"]";return o;}
typedef __int128 ll;
istream& operator>>(istream& i, ll& x){
x=0;
string s;
i>>s;
int N=s.size(),it=0;
if(s[0]=='-') it++;
for(;it<N;it++) x=(x*10+s[it]-'0');
if(s[0]=='-') x=-x;
return i;
}
ostream& operator<<(ostream& o, const ll& x){
ll tmp=x;
if(tmp==0) return o<<0;
if(tmp<0) o<<'-',tmp=-tmp;
vector<int> ds;
while(tmp) ds.pb(tmp%10),tmp/=10;
reverse(all(ds));
for(int d:ds) o<<d;
return o;
}
ll INF = 1LL<<62;
ll xs[26];
vector<ll> c2ts[26];
using namespace rel_ops;
struct F{
ll a,b;
F(ll a,ll b):a(a),b(b){}
bool operator<(const F& r) const {
return a*r.b < b*r.a;
}
};
int main(){
rep(i,26) cin>>xs[i];
{
string t;
cin>>t;
int N = t.size();
int num = 1;
rep(i,N){
if(i==N-1 || t[i]!=t[i+1]){
c2ts[t[i]-'a'].pb(num);
num = 0;
}
num++;
}
}
rep(i,26){
ll x = xs[i];
vector<ll> ts = c2ts[i];
ll T = 0;
for(ll t:ts) T += t;
if(T>x){
puts("0");
return 0;
}
}
ll ans = 1;
rep(i,26){
ll x = xs[i];
vector<ll> ts = c2ts[i];
ll T = 0;
for(ll t:ts) T += t;
if(T==0) continue;
if(T==1){
ans *= x;
if(ans>=INF) break;
continue;
}
if(T==2){
if(ts.size() == 1){
if(x%2==0){
ans *= x/2;
if(ans>=INF) break;
ans *= x-1;
if(ans>=INF) break;
}else{
ans *= x;
if(ans>=INF) break;
ans *= (x-1)/2;
if(ans>=INF) break;
}
}else{
ans *= x/2;
if(ans>=INF) break;
ans *= (x+1)/2;
if(ans>=INF) break;
}
continue;
}
priority_queue<F> que;
for(ll t:ts) que.push(F(t+1,1));
for(;x-T>0;x--){
F f = que.top();
que.pop();
ans *= f.a;
ans /= f.b;
if(ans>=INF) break;
que.push(F(f.a+1,f.b+1));
}
}
if(ans >= INF){
puts("hel");
}else{
cout<<ans<<endl;
}
}
sigma425