QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#428235 | #8769. Champernowne Substring | ucup-team3564# | TL | 8702ms | 3892kb | C++14 | 5.0kb | 2024-06-01 18:02:33 | 2024-06-01 18:02:33 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
#define mk make_pair
#define fi first
#define se second
#define int __int128
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
for(;(c<'0'||c>'9');c=getchar()){if(c=='-')f=-1;}
for(;(c>='0'&&c<='9');c=getchar())x=x*10+(c&15);
return x*f;
}
const int mod=998244353;
int ksm(int x,ll y,int p=mod){
int ans=1;y%=(p-1);
for(int i=y;i;i>>=1,x=1ll*x*x%p)if(i&1)ans=1ll*ans*x%p;
return ans%p;
}
int inv(int x,int p=mod){return ksm(x,p-2,p)%p;}
mt19937 rnd(time(0));
int randint(int l,int r){return rnd()%(r-l+1)+l;}
void add(int &x,int v){x+=v;if(x>=mod)x-=mod;}
void Mod(int &x){if(x>=mod)x-=mod;}
int cmod(int x){if(x>=mod)x-=mod;return x;}
template<typename T>void cmax(T &x,T v){x=max(x,v);}
template<typename T>void cmin(T &x,T v){x=min(x,v);}
string out(int x){
if(x<0)return "-"+out(-x);
string res="";res+=((char)(x%10+'0'));
if(x>=10)return out(x/10)+res;
return res;
}
int getpos(int w){
int ans=0;
for(int t=0,P=1;t<=30;t++,P*=10)if(w>=P)ans+=w-P;
return ans+1;
}
int chk_pos(string A,string B){
for(int i=0;i+B.size()<=A.size();i++){
bool chk=true;
for(int j=0;j<B.size();j++)if(B[j]!='?'&&A[i+j]!=B[j]){chk=false;break;}
if(chk)return i;
}
return -1;
}
const int D=26;
string get_str(int x){
string res="";
for(int i=x-D;i<=x+D;i++)if(i>=1)res+=out(i);
return res;
}
ostream &operator<<(ostream &fout,__int128 num){
fout<<out(num);
return fout;
}
void solve(){
string str;cin>>str;
// case 1
int w=0,ans=0;
if(str[0]=='?')w=1;
else if(str[0]=='0')w=10,ans++;
else w=str[0]-'0';
for(int i=1;i<str.size();i++){
w=w*10;
if(str[i]!='?')w+=str[i]-'0';
}
ans+=getpos(w);
// for(int i=1;i<=3000000;i++)if(getpos(i)>=8058869){cout<<"i = "<<out(i)<<endl;break;}
// cout<<"w = "<<out(w)<<" ans = "<<out(ans)<<" "<<out(ans%mod)<<endl;
// case 2
auto get_val=[&](int l,int r,int B)->__int128 {
// cout<<"get_val l,r = "<<l<<" "<<r<<" B = "<<B<<endl;
if(l>r)return 0;
int nl=l,nr=r;
string now="";for(int i=l;i<=r;i++)now+=str[i];
while(l>=0)l-=B,r-=B;
while(l<str.size()){
for(int i=l;i<=r;i++)if(i>=0&&i<str.size()){
if(str[i]=='?')continue;
if(now[i-l]=='?')now[i-l]=str[i];
else if(now[i-l]!=str[i])return -1;
}
l+=B,r+=B;
}
if(now[0]=='0')return -1;
if(now[0]=='?')now[0]='1';
int w=0;
for(int i=0;i<=r-l;i++){
w=w*10;
if(now[i]!='?')w+=now[i]-'0';
}
return w;
};
string tmp=str;
auto test=[&](int w){
string A=get_str(w);
int P=chk_pos(A,tmp);
// if(w==3989999){
// cout<<"test w = "<<w<<" P = "<<P<<endl;
// cout<<"A = "<<A<<endl;
// }
// cout<<getpos(469579807)<<" "<<getpos(469579807-D)<<" "<<w-D<<endl;
if(P!=-1)cmin(ans,P+getpos(max((__int128)(1),w-D)));
};
// test(3989999);
for(int i=1;i<=20;i++)test(i);
// int now=ans;ans=1e30;
// test(469579807);
// cout<<"ans = "<<ans<<endl;
// exit(0);
for(int i=1;i<=25;i++)str='?'+str;
// {
// int l=0,r=8;
for(int l=0;l<str.size();l++){
for(int r=max(l,(__int128)(25));r<str.size();r++)if(r-l+1<=25){
// cout<<"try l,r = "<<l<<" "<<r<<endl;
// int l=1,r=5;
int t=max(l,r-1);
function<void(int)>dfs=[&](int now){
if(now==r+1){
// cout<<"try str = "<<str<<endl;
int w=get_val(l,t-1,r-l+1);
if(w==-1)return ;
for(int i=t;i<=r;i++)w=w*10+str[i]-'0';
test(w);
// cout<<"w = "<<w<<" -> ans = "<<ans<<endl;
// if(w==65054)cout<<" w = "<<w<<endl;
return ;
}
if(str[now]!='?')dfs(now+1);
else{
for(int c=0;c<=9;c++)str[now]=(char)(c+'0'),dfs(now+1),str[now]='?';
}
};
dfs(t);
// cout<<" -> ans = "<<ans<<endl;
}
}
// cout<<"now ans = "<<ans<<endl;
// exit(0);
// for(int i=1;i<=25;i++)str='?'+str;
// ans-=25;
// cout<<"str = "<<str<<endl;
// cout<<" now ans = "<<ans<<endl;
for(int l=0;l<str.size();l++){
for(int r=max(l,(__int128)(25));r<str.size();r++)if(r-l+1<=25){
for(int t=r;t>=l+1;t--){
if(str[t]!='9'&&str[t]!='?')break;
int w=get_val(l,t-2,r-l+1);
if(w==-1)continue;
if(str[t-1]=='?'){
w=w*10;int tmp=w;
for(int c=0;c<=9;c++){
w=tmp+c;
for(int i=t;i<=r;i++)w=w*10+9;
test(w);
}
}
else{
w=w*10+str[t-1]-'0';
for(int i=t;i<=r;i++)w=w*10+9;
test(w);
}
// test(w);
// if(w==6999){
// cout<<"test l,r = "<<l<<" "<<r<<" t = "<<t<<" w = "<<w<<endl;
// cout<<" -> ans = "<<ans<<endl;
// }
}
}
}
// ans+=25;
for(int t=1,P=9;t<=25;t++,P=P*10+9)test(P);
// ans+=25;cmin(ans,now);
cout<<ans%mod<<endl;
// cout<<ans<<endl;
// cout<<getpos(3989999)+2<<endl;
// cout<<out(ans%mod)<<endl;
// ans=1e30;
// for(int w=1;w<=200000;w++)test(w);
// cout<<ans%mod<<endl;
}
signed main(void){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
// cout<<out(getpos(9))<<" "<<out(getpos(11))<<endl;
int tt=read();while(tt--)solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2108ms
memory: 3676kb
input:
9 0 ???1 121 1?1?1 ??5?54?50?5?505?65?5 000000000000 ?2222222 ?3????????9??8???????1??0 9?9??0????????????2
output:
11 7 14 10 314159 796889014 7777 8058869 38886
result:
ok 9 lines
Test #2:
score: 0
Accepted
time: 4822ms
memory: 3824kb
input:
10 0000000000000000000000000 0000000?002100000000000?0 6999?999?999999989?999999 0???0?1000?0??000?????0?1 9??9?999998?9?999999100?0 96?9997999?8999991????010 99?99??999999999??????99? ?0?0000?00000000?0210?0?0 99?999?999?99?9??999?9?9? 9?????9?99?99??9??99??9??
output:
545305036 574985081 788888865 5889591 902934046 488873 902034054 830780534 68888820 5882870
result:
ok 10 lines
Test #3:
score: 0
Accepted
time: 45ms
memory: 3656kb
input:
10 23573?0208935200503593500 08?9?1188980?661?18161467 22000103111010?24490??02? 4?129184?3644311331226625 9014217281609919609168?18 27809?1808?34646796569990 5116137658333853138917519 8778798398090800698?93888 742?9472125?9529272277272 5260238541343?22235629222
output:
108802929 797951281 758593545 919282423 660254768 34219412 452740345 687192108 692870314 277899385
result:
ok 10 lines
Test #4:
score: 0
Accepted
time: 5221ms
memory: 3892kb
input:
10 98898918898?0109088100808 ???08?9???1??????88?????? 8?1???????0118????00???8? ??1880????1?8???111101108 ???????11??1????0???000?? ?9?01???0????9????8???9?? ???1?1?????1????90?0????0 ??8?????????18?9????????? 8????91?8???????????????9 ??0????1?????9??8?909???0
output:
397005130 796170672 681417627 201652995 493829373 76730467 798698896 6434 43334 443792
result:
ok 10 lines
Test #5:
score: 0
Accepted
time: 329ms
memory: 3720kb
input:
10 012003??1?0?591??0?30?30? 1000?0?1100000?731?101211 ?0?11?80101111?1??1328??? 411410110174?154311111111 20005??141101015?0?1?0??1 5??81010????10???237300?0 ?3605?3611014?09?446?6313 1110015171261071000007001 991?11162011?0191117?0410 ?200500??003??60??01900?2
output:
900307781 839110958 981675858 995851013 389598828 122551361 79267861 295093505 388362258 286706944
result:
ok 10 lines
Test #6:
score: 0
Accepted
time: 2046ms
memory: 3664kb
input:
10 ?150?7??2???902??0?80?70? 1??????11??????001?1?1017 ???12???1?5111?1??3?0???? 61165?11?196?376621133111 0???0??1041?5?20???1????1 0???3?2?????1????70?0???? ?7????7?11?48????98???747 1420?2717247207100?0?8??1 001?13185031??301119??71? ?5??0??????7??0????10???5
output:
864484608 74700832 681727245 536368659 226329329 975189011 448648057 967696005 376743109 173528449
result:
ok 10 lines
Test #7:
score: 0
Accepted
time: 2471ms
memory: 3892kb
input:
10 2??0?0??4??3 ??0?64?5???1???? ??????????01???0017???0 1147???1?1? 07?060????0?? 0706457?760130 ??4????3???4? 199?0?19?0?2262880 3675036117 032?????8?0??00??
output:
6099056 69020130 488979 68978070 41928 657141248 909 87550531 643195723 982967061
result:
ok 10 lines
Test #8:
score: 0
Accepted
time: 20ms
memory: 3648kb
input:
10 1004024914000141171664179 4112700045099296212010057 2000700072177165003008355 5147124088080418420102215 0111131163261117111189161 0000000507001000083001045 4616130013212189231581163 6370033693059001070063068 2600011505817800101005111 8171898166180081571808187
output:
492541635 485994730 881341707 302237585 319228799 682761479 494203217 307458184 948671187 770194561
result:
ok 10 lines
Test #9:
score: 0
Accepted
time: 2200ms
memory: 3656kb
input:
10 9999??1?24109 9961?9?99?9?17??9?9981?9 ?55139?310? 01060999911010?100001 ????1???0???0 1999?9?9??1?1?99 ?6?098?????0?91?06? ??9?9?9920 1009??99?9?83011009 ?08815?9?290?6??8159992?
output:
701914982 502544507 838514018 198720051 210 1088344 69369676 88485 208314295 325404847
result:
ok 10 lines
Test #10:
score: 0
Accepted
time: 2394ms
memory: 3720kb
input:
10 ???9?9????9??1????0?00?0? ?19??5?6705?2006?7?705420 ?8?99??9?10????00?000???? 26??9???8??1862?9?99???1? ?1?811????119911?1801?0?1 99?0?7?400?????0?7???0??0 9981?80?15??9?99??9??8?2? 87??9787249?8724?98725008 ?1???1??7??9?????7??9???? 529999810002?2999991000??
output:
488877 578261397 68888881 922387376 922701699 750962293 869492708 5123872 795205985 107899748
result:
ok 10 lines
Test #11:
score: 0
Accepted
time: 3718ms
memory: 3812kb
input:
10 ?????????????0??0?0?0??0? ?7??1???99???991?070??000 30???7??????8???1??????1? ??45??9?99?9??50????0?09? ?6???0?????9????6?6???0?0 1?????71??811??12?0?2???? ?0???0???0???0??0?0?????0 1????999?8???1?8??0?0?088 0??3?000?81?0?030??0181?0 ????9?9??99??0??0?81???00
output:
38878 974988866 7995940 207215288 789434908 3675 2915 656463525 46595272 162777032
result:
ok 10 lines
Test #12:
score: 0
Accepted
time: 6424ms
memory: 3668kb
input:
10 ???????2?6?9?99????9??6?? ?9?9??6???9?9??2????0?6?? ?13?11?1????7?1??????1?99 ??9???9011??00?999?9??1?? 0?0?1??0?2?00????1??110?2 ?6?301?1818??9??????11??? ?1????8?????99??2???????2 ?9?????4????9?9??73?49??? ???9?7????98??9?????????? ?96??9?7?????????99????9?
output:
785875062 118488877 347574749 926770730 39160338 299823179 6742876 217198712 548872 438872
result:
ok 10 lines
Test #13:
score: 0
Accepted
time: 3284ms
memory: 3604kb
input:
10 ???97??0?99???07?99?00800 ?99??3?04??9??310??000?3? 2????1?1?????001???1??632 ??1???????????39?????9??? 0???5?60?9???????9?2????0 9??99?9?93?191???9??99993 9733?98???993?1?03?101331 9??07?30000207?3?0?1?0703 ?9?86?00?00086??0?00????0 ????1?99??181?9????8??00?
output:
5944871 70013524 400601421 40868 35709572 642051114 154378 753914535 641178416 83376873
result:
ok 10 lines
Test #14:
score: 0
Accepted
time: 6750ms
memory: 3676kb
input:
10 9?20?0???0???00???01?0??0 9?9?1?9???19??97????????? ??9????1?1??00?0??1?9???? 9??6168??9?9?9??6?9??998? 9??963702???9?9?9?9???0?? 9?????????9?9??8?9???9?9? ?07????0??0?????0????0??? 9???9????1???9?99?9???1?9 5?8??99???????89??999?9?7 ????9?74???9?9???????????
output:
690644535 1083462 798698973 995370331 446157661 5882928 530890 148240876 882732928 69688682
result:
ok 10 lines
Test #15:
score: 0
Accepted
time: 8702ms
memory: 3804kb
input:
10 9??9?53??000?3?0?????0?0? ?8???9??72???9????28??9?? 999?9180?0??????????0???? 9?99???00??0?0?????0????? 9?????9??000?????0????00? ?999???99?0?????0???????? ?????0?0??5?80???00?????? 9??????????????5?9??9??9? ?????9?????8?9?999??????0 ???????61??9?9????9??????
output:
35988885 854409694 510644532 488886 488882 38881 789346093 1059429 438873 5952561
result:
ok 10 lines
Test #16:
score: -100
Time Limit Exceeded
input:
10 ?199???9??5?999??9965?9?9 ????0??????9??5?????????? ??????????0?0?00??1????0? 7????9?1?????0??????????? ???????0???????????60???? ????9??????0??9????4????? ????????????????????????? ????0??20?0??????????0??? ????0???????????????????? ????999??999??????????0?2
output:
885690430 167 488883 2883 39174 782884 1 88923