제출 #1178606

#제출 시각아이디문제언어결과실행 시간메모리
1178606alexander707070상형문자열 (IOI24_hieroglyphs)C++20
0 / 100
1082 ms364732 KiB
#include<bits/stdc++.h> #define MAXN 3007 using namespace std; int n,m,k,cnt; int a[MAXN],b[MAXN],c[MAXN]; int dp[MAXN][MAXN]; int nxt[MAXN][2*MAXN],last[2*MAXN]; unordered_map<int,int> mp; int ret[200007]; void compress(){ vector<int> vals; for(int i=1;i<=n;i++)vals.push_back(a[i]); for(int i=1;i<=m;i++)vals.push_back(b[i]); sort(vals.begin(),vals.end()); cnt=0; for(int i=0;i<vals.size();i++){ if(i==0 or vals[i]!=vals[i-1])cnt++; mp[vals[i]]=cnt; ret[cnt]=vals[i]; } for(int i=1;i<=n;i++)a[i]=mp[a[i]]; for(int i=1;i<=m;i++)b[i]=mp[b[i]]; } void findseq(int l,int r){ if(dp[l][r]==0)return; if(dp[l][r]==dp[l-1][r]){ findseq(l-1,r); return; } if(dp[l][r]==dp[l][r-1]){ findseq(l,r-1); return; } k++; c[k]=a[l]; findseq(l-1,r-1); } unordered_set<long long> s; long long state(long long a,long long b,long long c){ return c+b*10000+a*10000*10000; } bool brute(int x,int y,int z){ if(x==n+1 or y==n+1)return false; long long curr=state(x,y,z); if(s.find(curr)!=s.end())return false; s.insert(curr); bool res=false; if(a[x]==b[y]){ if(nxt[z][a[x]]>k)res=true; else if(brute(x+1,y+1,nxt[z][a[x]]))res=true; }else{ if(brute(x+1,y,z))res=true; else if(brute(x,y+1,z))res=true; } return res; } vector<int> ucs(vector<int> A, vector<int> B){ n=int(A.size()); m=int(B.size()); for(int i=1;i<=n;i++)a[i]=A[i-1]; for(int i=1;i<=m;i++)b[i]=B[i-1]; compress(); for(int i=1;i<=n;i++){ for(int f=1;f<=m;f++){ dp[i][f]=max(dp[i-1][f],dp[i][f-1]); if(a[i]==b[f])dp[i][f]=max(dp[i][f],dp[i-1][f-1]+1); } } findseq(n,m); reverse(c+1,c+k+1); for(int i=1;i<=cnt;i++)last[i]=k+1; for(int i=k;i>=0;i--){ for(int f=1;f<=cnt;f++)nxt[i][f]=last[f]; last[c[i]]=i; } vector<int> sol; if(!brute(1,1,0)){ for(int i=1;i<=k;i++)sol.push_back(ret[c[i]]); return sol; } return {-1}; } /*int main(){ //auto s=ucs({0, 0, 1, 0, 1, 2}, {2, 0, 1, 0, 2}); auto s=ucs({0, 1, 0}, {1, 0, 1}); for(int i:s)cout<<i<<" "; return 0; }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...