Submission #68180

#TimeUsernameProblemLanguageResultExecution timeMemory
68180hamzqq9Permutation Recovery (info1cup17_permutation)C++14
100 / 100
3738 ms8352 KiB
#include<bits/stdc++.h> #define st first #define nd second #define pb push_back #define ppb pop_back #define umax(x,y) x=max(x,y) #define umin(x,y) x=min(x,y) #define ll long long #define ii pair<int,int> #define iii pair<int,ii> #define sz(x) ((int) x.size()) #define orta ((bas+son)>>1) #define all(x) x.begin(),x.end() #define dbgs(x) cerr<<(#x)<<" --> "<<(x)<<" " #define dbg(x) cerr<<(#x)<<" --> "<<(x)<<endl;getchar() #define pw(x) (1<<(x)) #define inf 1000000000 #define MOD 25591308716929 #define N 70005 #define MAX 10000006 #define LOG 30 #define KOK 250 #define form(x) (x<0?x+MOD:x>=MOD?x-MOD:x) using namespace std; int n,gsz,cache,len; ll prevv; ll lazy[KOK+100]; int sz[KOK+100],ans[N]; pair<ll,int> GR[KOK+100][KOK*4+100]; pair<ll,int> ar[N]; char s[N*20]; unordered_set<ll> MP[KOK+100]; ll get_hash() { ll res=0; for(int i=1;i<=len;i++) res=(res*10+(s[i]-'0'))%MOD; return res; } void rebuild() { int cnt=0; cache=0; for(int i=1;i<=gsz;i++) { for(int j=1;j<=sz[i];j++) { GR[i][j].st=form(GR[i][j].st+lazy[i]); ar[++cnt]=GR[i][j]; } MP[i].clear(); } gsz=0; for(int i=1;i<=cnt;i+=KOK) { ++gsz; sz[gsz]=0; lazy[gsz]=0; for(int j=i;j<=min(i+KOK-1,cnt);j++) { GR[gsz][++sz[gsz]]=ar[j]; MP[gsz].insert(ar[j].st); } } } void insert_here(ll val,int ith,int gr) { MP[gr].clear(); if(lazy[gr]) { for(int i=1;i<=sz[gr];i++) GR[gr][i].st=form(GR[gr][i].st+lazy[gr]); lazy[gr]=0; } for(int i=sz[gr];i>=1;i--) { if((GR[gr][i].st+1)==val) { GR[gr][i+1]={form(GR[gr][i].st+val),ith}; break ; } GR[gr][i+1]=GR[gr][i]; GR[gr][i+1].st=form(GR[gr][i+1].st+val); } sz[gr]++; for(int i=1;i<=sz[gr];i++) { MP[gr].insert(GR[gr][i].st); } } void insert(ll val,int ith) { cache++; for(int i=gsz;i>=1;i--) { ll want=form(val-lazy[i]-1+MOD); if(MP[i].find(want)!=MP[i].end()) { insert_here(val,ith,i); if(cache==KOK*3) { rebuild(); } return ; } else lazy[i]=form(lazy[i]+val); } } int main() { //freopen("input.txt","r",stdin); scanf("%d",&n); gsz=1; GR[1][1]={0,0}; sz[1]=1; MP[1].insert(0); for(int i=1;i<=n;i++) { scanf("%s",s+1); len=strlen(s+1); ll num=get_hash(); ll no=form(num-prevv+MOD); prevv=num; insert(no,i); } int val=-1; for(int i=1;i<=gsz;i++) { for(int j=1;j<=sz[i];j++) { ans[GR[i][j].nd]=++val; } } for(int i=1;i<=n;i++) printf("%d ",ans[i]); }

Compilation message (stderr)

permutation.cpp: In function 'int main()':
permutation.cpp:156:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
  ~~~~~^~~~~~~~~
permutation.cpp:168:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s",s+1);
   ~~~~~^~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...