QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#428235#8769. Champernowne Substringucup-team3564#TL 8702ms3892kbC++145.0kb2024-06-01 18:02:332024-06-01 18:02:33

Judging History

你现在查看的是最新测评结果

  • [2024-06-01 18:02:33]
  • 评测
  • 测评结果:TL
  • 用时:8702ms
  • 内存:3892kb
  • [2024-06-01 18:02:33]
  • 提交

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

result: