Submission #226427

#TimeUsernameProblemLanguageResultExecution timeMemory
226427MKopchev세 명의 친구들 (BOI14_friends)C++14
0 / 100
87 ms18072 KiB
#include<bits/stdc++.h> using namespace std; const int nmax=2e6+42,base=31,mod=1e9+9; string inp; string outp; int n,sz; int st[nmax],pref[nmax]; set<int> seen; int ask(int l,int r) { if(l>r)return 0; long long help=pref[r]; long long sub=0; if(l)sub=pref[l-1]; sub=sub*st[r-l+1]%mod; //cout<<"ask "<<l<<" "<<r<<" -> "<<((help-sub)%mod+mod)%mod<<endl; return ((help-sub)%mod+mod)%mod; } void pick(int l,int r) { int now=ask(l,r); if(seen.count(now))return; seen.insert(now); if(seen.size()>=2) { cout<<"NOT UNIQUE"<<endl; exit(0); } for(int i=l;i<=r;i++) outp.push_back(inp[i]); } int main() { ios_base::sync_with_stdio(false); cin.tie(); cout.tie(); cin>>sz; cin>>inp; n=(sz-1)/2; pref[0]=inp[0]-'A'; for(int i=1;i<sz;i++) pref[i]=(1LL*pref[i-1]*base+inp[i]-'A')%mod; st[0]=1; for(int i=1;i<sz;i++)st[i]=1LL*st[i-1]*base%mod; //in the first half for(int i=0;i<=n;i++) { //cut i-th long long part1=ask(0,i-1)*st[n-i]; long long part2=ask(i+1,n); part1=(part1+part2)%mod; if(part1==ask(n+1,sz-1)) pick(n+1,sz-1); } //in the second half for(int i=n;i<sz;i++) { //cut i-th long long part1=ask(n,i-1)*st[sz-1-i]; long long part2=ask(i+1,sz-1); part1=(part1+part2)%mod; if(part1==ask(0,n-1)) pick(0,n-1); } if(outp.size())cout<<outp<<endl; else cout<<"NOT POSSIBLE"<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...