結果
問題 | No.1927 AB-CD |
ユーザー | vjudge1 |
提出日時 | 2024-10-24 21:35:58 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,636 bytes |
コンパイル時間 | 11,407 ms |
コンパイル使用メモリ | 183,260 KB |
実行使用メモリ | 96,436 KB |
最終ジャッジ日時 | 2024-10-24 21:36:15 |
合計ジャッジ時間 | 15,919 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | RE | - |
testcase_05 | RE | - |
testcase_06 | RE | - |
testcase_07 | RE | - |
testcase_08 | RE | - |
testcase_09 | RE | - |
testcase_10 | RE | - |
testcase_11 | RE | - |
testcase_12 | RE | - |
testcase_13 | RE | - |
testcase_14 | RE | - |
testcase_15 | RE | - |
testcase_16 | RE | - |
testcase_17 | RE | - |
testcase_18 | RE | - |
testcase_19 | RE | - |
testcase_20 | RE | - |
testcase_21 | RE | - |
testcase_22 | RE | - |
testcase_23 | RE | - |
testcase_24 | RE | - |
testcase_25 | RE | - |
testcase_26 | RE | - |
testcase_27 | WA | - |
testcase_28 | WA | - |
testcase_29 | TLE | - |
ソースコード
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=33*33*33*33; int n,m,q,cntb,cnt,fr[4],deg[N],dfn[N],low[N],bel[N],pri[]={0,2,3,5,7,11,13,17,19,23,27,29,31},num[33][33]; ll f[N],val[N],valb[N]; bool vis[N],ex[N]; stack<int> stk; unordered_map<ll,bool> mp; string s,t; vector<int> a[N],b[N]; int id(int a,int b,int c,int d) { int t=n+1; return a*t*t*t+b*t*t+c*t+d; } ll q_pow(ll a,ll b) { ll ret=1; while(b) { if(b&1) ret=ret*a; a=a*a; b>>=1; } return ret; } void tarjan(int u) { dfn[u]=low[u]=++cnt; stk.push(u); vis[u]=true; for(int i=0;i<a[u].size();i++) { int v=a[u][i]; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(vis[v]) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { ++cntb; int v; do { v=stk.top(); stk.pop(); vis[v]=false; bel[v]=cntb; }while(v!=u); } } void topo() { queue<int> que; for(int i=1;i<=cntb;i++) if(!deg[i]) que.push(i); while(!que.empty()) { int u=que.front(); que.pop(); f[u]+=valb[u]; for(int i=0;i<b[u].size();i++) { int v=b[u][i]; f[v]=max(f[v],f[u]); deg[v]--; if(deg[v]==0) que.push(v); } } ll ans=0; for(int i=1;i<=cntb;i++) ans=max(ans,f[i]); cout<<ans; } void init() { q=(n+1)*(n+1)*(n+1)*(n+1); for(int i=2;i<=n;i++) { int u=i; for(int j=1;j<=12;j++) { while(u%pri[j]==0) u/=pri[j],num[i][j]++; num[i][j]+=num[i-1][j]; } } for(int ka=0;ka<=n;ka++) { for(int kb=0;ka+kb<=n;kb++) { for(int kc=0;ka+kb+kc<=n;kc++) { int kd=n-ka-kb-kc; int uid=id(ka,kb,kc,kd); val[uid]=1; for(int j=1;j<=12;j++) val[uid]*=q_pow(pri[j],num[n][j]-num[ka][j]-num[kb][j]-num[kc][j]-num[kd][j]); } } } } int main() { cin>>n>>m; init(); for(int i=1;i<=m;i++) { cin>>s>>t; if(s==t) continue; memset(fr,0,sizeof(fr)); for(int j=0;j<s.length();j++) fr[s[j]-'A']--; for(int j=0;j<t.length();j++) fr[t[j]-'A']++; for(int ka=max(0,-fr[0]);ka<=n;ka++) for(int kb=max(0,-fr[1]);ka+kb<=n;kb++) for(int kc=max(0,-fr[2]);ka+kb+kc<=n;kc++) { int kd=n-ka-kb-kc; if(kd+fr[3]<0) continue; int uid=id(ka,kb,kc,kd),vid=id(ka+fr[0],kb+fr[1],kc+fr[2],kd+fr[3]); a[uid].push_back(vid); ex[uid]=ex[vid]=true; } } for(int i=0;i<q;i++) if(!dfn[i]&&ex[i]) tarjan(i); for(int i=0;i<q;i++) { if(!ex[i]) continue; int u=bel[i]; valb[u]+=val[i]; for(int j=0;j<a[i].size();j++) { int v=bel[a[i][j]]; ll tid=1ll*min(u,v)*q+max(u,v); if(!mp[tid]&&u!=v) { mp[tid]=true; b[u].push_back(v); deg[v]++; } } } topo(); }