結果
問題 | No.295 hel__world |
ユーザー |
|
提出日時 | 2021-09-08 00:32:08 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 140 ms / 5,000 ms |
コード長 | 3,859 bytes |
コンパイル時間 | 2,407 ms |
コンパイル使用メモリ | 212,888 KB |
最終ジャッジ日時 | 2025-01-24 08:45:35 |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 53 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:132:24: warning: narrowing conversion of ‘(p + 1)’ from ‘long long int’ to ‘long double’ [-Wnarrowing] 132 | que.push({p+1,{p+1,p}}); | ~^~
ソースコード
#include<bits/stdc++.h>using namespace std;#define rep(i,n) for(ll i=0;i<n;i++)#define repl(i,l,r) for(ll i=(l);i<(r);i++)#define per(i,n) for(ll i=(n)-1;i>=0;i--)#define perl(i,r,l) for(ll i=r-1;i>=l;i--)#define fi first#define se second#define pb push_back#define ins insert#define pqueue(x) priority_queue<x,vector<x>,greater<x>>#define all(x) (x).begin(),(x).end()#define CST(x) cout<<fixed<<setprecision(x)#define vtpl(x,y,z) vector<tuple<x,y,z>>#define rev(x) reverse(x);using ll=long long;using vl=vector<ll>;using vvl=vector<vector<ll>>;using pl=pair<ll,ll>;using vpl=vector<pl>;using vvpl=vector<vpl>;const ll MOD=1000000007;const ll MOD9=998244353;const int inf=1e9+10;const ll INF=4e17;const ll dy[9]={0,1,-1,0,1,1,-1,-1,0};const ll dx[9]={1,0,0,-1,1,-1,1,-1,0};template<class T> inline bool chmin(T& a, T b) {if (a > b) {a = b;return true;}return false;}template<class T> inline bool chmax(T& a, T b) {if (a < b) {a = b;return true;}return false;}pair<vector<char>,vector<ll>> rle(string s){vector<char> cha;vector<ll> num;ll a=0,cnt=0;char x=s[0];while(a<s.size()){if(x==s[a])cnt++;else{cha.push_back(x);num.push_back(cnt);x=s[a];cnt=1;}a++;}cha.push_back(x);num.push_back(cnt);return {cha,num};}/*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.push_back(tmp % 10), tmp /= 10;reverse(ds.begin(), ds.end());for (int d : ds) o << d;return o;}struct node{ll den,num,d,x;const bool operator>(const node &b) const {return den*b.num > num*b.den;}};*/int main(){vector<ll> v(26);rep(i,26)cin >> v[i];string t;cin >> t;auto [ch,num]=rle(t);vvl cnt(26);rep(i,ch.size())cnt[ch[i]-'a'].push_back(num[i]);bool ok=true;rep(i,26){ll ret=0;for(auto p:cnt[i])ret+=p;if(ret>v[i])ok=false;v[i]-=ret;}if(!ok)cout << 0 << endl,exit(0);using ld=long double;ld ans=1;rep(i,26){if(cnt[i].empty())continue;sort(all(cnt[i]));if(cnt[i].size()==1){rep(j,min(cnt[i][0],v[i])){ans*=cnt[i][0]+v[i]-j;ans/=j+1;if(ans>=1LL<<62){cout << "hel" << endl;return 0;}}continue;}if(cnt[i].back()==1){ll p=cnt[i].size();ll al=v[i]+p;rep(j,al%p){ans*=al/p+1;if(ans>=1LL<<62){cout << "hel" << endl;return 0;}}rep(j,p-al%p){ans*=al/p;if(ans>=1LL<<62){cout << "hel" << endl;return 0;}}continue;}priority_queue<pair<ld,pair<ll,ll>>> que;for(auto p:cnt[i]){que.push({p+1,{p+1,p}});}while(v[i]--){auto ret=que.top();que.pop();ans*=ret.first;if(ans>=1LL<<62){cout << "hel" << endl;return 0;}ret.second.first++;ld q=ret.second.first;q/=q-ret.second.second;que.push({q,ret.second});}}CST(0);if(ans>=1LL<<62)cout << "hel" << endl;else cout << ans << endl;}