QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#661045#8769. Champernowne SubstringfryanWA 993ms3976kbC++177.1kb2024-10-20 14:28:132024-10-20 14:28:14

Judging History

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

  • [2024-10-20 14:28:14]
  • 评测
  • 测评结果:WA
  • 用时:993ms
  • 内存:3976kb
  • [2024-10-20 14:28:13]
  • 提交

answer

#include "bits/stdc++.h"
using namespace std;
#define int int64_t
#define i128 __int128_t
#define all(x) begin(x), end(x)
#define sz(x) (int) (x).size()

const int mod = 998244353;

string s;

std::string to_string(__int128 num) {
    if (num == 0) return "0";

    bool is_negative = num < 0;
    std::string result;

    if (is_negative) num = -num;

    while (num > 0) {
        result += '0' + (num % 10);  // Append last digit
        num /= 10;                   // Remove last digit
    }

    if (is_negative) result += '-';  // Add negative sign if needed

    std::reverse(result.begin(), result.end());  // Reverse to correct order
    return result;
}

namespace util {
	string qmk[500];
	void init() {
		qmk[0] = "";
		for (int i=1; i<500; i++) {
			qmk[i] = qmk[i-1]+"?";
		}
	}
	int len(i128 s) {
		return sz(to_string(s));
	}
	i128 ksm(int a, int b) {
		i128 res=1;
		for (int i=0; i<b; i++) {
			res = res*a;
		}
		return res;
	}
	i128 answer(i128 v) {
		if (v==0) return 0;
		v--;
		if (v==0) return 0;
		i128 f = len(v);
		i128 pv = ksm(10,f-1);
		return f*(v-pv+1)+answer(pv);
	}
	__int128 sto128(const std::string& str) {

	    __int128 result = 0;
	    bool is_negative = (str[0] == '-');
	    size_t start = is_negative ? 1 : 0;
	
	    for (size_t i = start; i < str.size(); ++i) {
	        if (str[i] < '0' || str[i] > '9') {
	            throw std::invalid_argument("Invalid character in string.");
	        }
	        result = result * 10 + (str[i] - '0');
	    }
	    return is_negative ? -result : result;
	}
}

namespace brutal_check {
	const int LIM = 9999;
	bool equal(string s1, string s2) {
		if (sz(s1) != sz(s2)) return 0;
		for (int i=0; i<sz(s1); i++) {
			if (s1[i]!=s2[i] && s1[i]!='?' && s2[i]!='?') return 0;
		}
		return 1;
	}
	bool check(i128 start,string s) {
		string s1 = "";
		for (i128 i=start; sz(s1) < sz(s); i++) {
			s1 = s1+to_string(i);
		}
		s1.resize(sz(s));
		return equal(s,s1);	
	}
	i128 cp10() {
		i128 res = -1;
		for (int len = 1; len <= 26; len++) {
			i128 v = util::ksm(10,len);
			i128 xx = util::answer(v);
			for (int expa = 0; expa < 60; expa++) {
				string ss = util::qmk[expa]+s;
				for (int cv = v; cv >= max((i128)1,v-60); cv--) {
					if (check(cv,ss)) {
						i128 ans = util::answer(cv) + expa + 1;
						if (res==-1) res = ans;
						res = min(res,ans);
					}
				}
			}
		}
		return res;
	}
	
	i128 go() {
		i128 res = -2;
		for (int i=1; i<=LIM; i++) {
			int l = util::len(i);
			for (int pad=0; pad<l; pad++) {
				string ss = util::qmk[pad]+s;
				if (check(i,ss)) {
					i128 ans = util::answer(i)+pad;
					if (res==-2) res = ans;
					else res = min(res,ans);
				}
			}
		}
		return res+1;
	}
}

namespace large_check {
	const int LIM = 26;
	
	/*
	casework on:
	- length of numbers [assume stays constant for this one]
	- greatest index that changes in value
		- from ...x99999 to ...x+100000
	*/
	
	int cor[26];
	
	bool compatible(string s, string s1) {
		assert(sz(s)==sz(s1));
		memset(cor,-1,sizeof(cor));
		for (int i=0; i<sz(s); i++) {
			if ('a' <= s1[i] && s1[i] <= 'z' && s[i] != '?') {
				int k = s1[i] - 'a';
				int v = s[i] - '0';
				if (cor[k]==-1) cor[k] = v;
				if (cor[k] != v) return 0;
			}
			if ('0' <= s1[i] && s1[i] <= '9') {
				int v = s1[i] - '0';
				if (s[i]=='?') continue;
				int v1 = s[i]-'0';
				if (v != v1) return 0;
			}
		}
		return 1;
	}
	i128 check_no_change(int len, string s, int pad=0) {
		//pad s with additional ?s
		int need = (len-sz(s)%len)%len;
		s.resize(sz(s)+need,'?');
		//fill in everything BUT units [they don't change]
		char cur = 'a';
		string s1; s1.resize(sz(s),'?');
		for (int r=0; r+1<len; r++) {
			for (int i=0; i*len<sz(s); i++) {
				s1[i*len+r] = cur;
			}
			cur++;
		}
		if (!compatible(s,s1)) return -1;
		if (cor[s1[0]-'a'] == 0) return -1;
		for (int i=0; i<26; i++) {
			if (cor[i]==-1) cor[i] = 0;
		}
		if (cor[s1[0]-'a'] == 0) cor[s1[0]-'a']=1;
		for (int i=0; i<sz(s1); i++) {
			if (i%len == len-1) continue;
			s1[i] = '0'+cor[s1[i]-'a'];
		}
		for (int s0 = 0; s0<10; s0++) {
			int cv = s0;
			string s2 = s1;
			for (int i=0; i*len<sz(s); i++) {
				if (cv==10) return -1;
				s2[i*len+len-1] = cv+'0';
				cv++;
			}
			if (compatible(s,s2)) {
				string first = s2.substr(0,len);
				i128 ans = util::sto128(first);
				i128 res = util::answer(ans)+pad+1;
				return res;
			}
		}
		return -1;
		
	}
	i128 check(int len, int ind, string s, int pad=0) {
		//pad s with additional ?s
		int need = (len-sz(s)%len)%len;
		s.resize(sz(s)+need,'?');
		string s1; s1.resize(sz(s),'?');
		i128 lok = len-ind%len; //length of known
		i128 vok = util::ksm(10,lok)-1; //value of known
		i128 iok = ind/len; //index [in lengths] of known
				
		for (int i=0; i*len<sz(s); i++) {
			string v = to_string(vok-(iok-i));
			v = v.substr(sz(v)-lok,sz(v));
			s1.replace(i*len + ind%len, lok, v);
		}
		//r=ind%len+1
		
		int rr = ind%len-1;
		for (int i=0; i*len<sz(s); i++) {
			int pos = i*len+rr;
			if (pos < ind) s1[pos] = 'a';
			else s1[pos] = 'b';
		}
		
		char cur = 'c';
		for (int r=ind%len-2; r>=0; r--) {
			for (int i=0; i*len<sz(s); i++) {
				int pos = i*len+r;
				s1[pos] = cur;
			}
			cur++;
		}
	
		if (!compatible(s,s1)) return -1;
		if (cor[0]==9 || cor[1]==0) return -1;
		
		if (cor[0]==-1 && cor[1]==-1) {
			cor[0] = 0, cor[1] = 1;
		} else if (cor[0]==-1) {
			cor[0] = cor[1]-1;
		} else if (cor[1]==-1) {
			cor[1] = cor[0]+1;
		} else if (cor[0]+1!=cor[1]) {
			return -1;
		}
		if (cor[s1[0]-'a']==0) return -1;

		for (int i=2; i<26; i++) {
			if (cor[i]==-1) cor[i] = 0;
		}
		if (cor[s1[0]-'a']==0) cor[s1[0]-'a']=1;
		
		string first = s1.substr(0,len);
		for (int i=0; i<len; i++) {
			if ('a' <= first[i] && first[i] <= 'z') {
				first[i] = '0' + cor[first[i]-'a'];
			}
		}
		
		i128 ans = util::sto128(first);
		i128 res = util::answer(ans)+pad+1;
		return res;
	}
	
	i128 go() {
		i128 res = -1;
		for (int len=2; len<=LIM; len++) {
			for (int pad=0; pad<len; pad++) {
				string ss = util::qmk[pad]+s;
				int rem = (len-sz(ss)%len)%len;
				ss.resize(sz(ss)+rem,'?');
				for (int ind=0; ind<sz(ss); ind++) {
					if (ind%len==0) continue;
					i128 v = check(len,ind,ss,pad);
					if (v==-1) continue;
					if (res==-1) {
						res = v;
					}
					res = min(res,v);
				}
			}
		}
		for (int len=2; len<=LIM; len++) {
			for (int pad=0; pad<len; pad++) {
				string ss = util::qmk[pad]+s;
				i128 v = check_no_change(len,ss,pad);
				if (v==-1) continue;
				if (res==-1) res = v;
				res = min(res,v);
			}
		}
		return res;
	}
}

i128 minn(i128 a, i128 b) {
	if (a==-1) return b;
	if (b==-1) return a;
	return min(a,b);
}

void solve() {
	cin>>s;
	i128 c = minn(brutal_check::cp10(),minn(brutal_check::go(),large_check::go()));
	c %= mod;
	cout<<to_string(c)<<"\n";
}

signed main() {
	ios::sync_with_stdio(false); cin.tie(nullptr);
	util::init();
		
	int t; cin>>t;
	while (t--) {
		solve();
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 575ms
memory: 3972kb

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: 876ms
memory: 3764kb

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: 841ms
memory: 3684kb

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: 866ms
memory: 3636kb

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: 838ms
memory: 3692kb

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: 853ms
memory: 3756kb

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: 677ms
memory: 3680kb

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: 819ms
memory: 3936kb

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: 718ms
memory: 3684kb

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: 849ms
memory: 3960kb

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: 860ms
memory: 3760kb

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: 865ms
memory: 3688kb

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: 852ms
memory: 3640kb

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: 879ms
memory: 3640kb

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: 895ms
memory: 3680kb

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: 0
Accepted
time: 993ms
memory: 3976kb

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
7
148888874

result:

ok 10 lines

Test #17:

score: 0
Accepted
time: 857ms
memory: 3744kb

input:

10
?86399?86??99864000864?01
????998??99??0?5???5?02??
769999??9?999???????0????
??89?6?8?8???99?1?0???9??
??9??71?2099?9?8?32?99999
9?99853?99?999?400000?05?
9??????9??99?9??10??00??0
07908???????11?129?3?14??
976?9???9?6?006?0?????63?
??76?????9?9???????9???6?

output:

5072877
18879
4088877
298375
119956628
755911464
5888874
2612
24080
334377

result:

ok 10 lines

Test #18:

score: 0
Accepted
time: 886ms
memory: 3960kb

input:

10
?529???2987??9?753?075?01
72?9???29??9??0?0??30??01
9984?99999??200?00?42?00?
9???????999???1????????1?
9?9?869?99?999?0????00070
7?5989599?60?960196?296?3
??418??1894190??91419??19
??????????999????99??9???
99?9989759999?99??0?0?00?
?????????8????9???9?????1

output:

365375
1688877
324888879
68976879
199422758
37281
15640
2849
686934051
6438

result:

ok 10 lines

Test #19:

score: 0
Accepted
time: 860ms
memory: 3752kb

input:

10
79?95?9?969??99?6??0009?9
7?9??9?8?999?9?900???0?0?
??6??6?86?7699??7700?7?7?
????8?0?99?92??0?0?????0?
99?99?8499?9??995?????0?0
7???82?3?21?????1?14???4?
7??879?081?28?8?8??6?78??
9?99999?9?3?00?000?30000?
1?9?1998199920?0?00?2?0?2
?4???84???????????????1??

output:

66760875
61888875
3955076
12958878
395911462
7441
144
272934057
6878
2423

result:

ok 10 lines

Test #20:

score: 0
Accepted
time: 857ms
memory: 3792kb

input:

10
87??9?88?1999??72000?87??
?0???5?998????9?1?????0??
??99719?99????9?9?920?0??
??9??82?9999??3?000????00
??????????100??1?00???0??
?74918?91?4?2??9?1??2249?
77????9?????????8??????0?
75???????2?99???????5?4??
9???9?9?9?9?0?9?0?9?0??5?
8?7999??938000000?800??01

output:

59928876
243875
1040873
14988877
38880
18560
2283
3203277
36880
292888881

result:

ok 10 lines

Test #21:

score: 0
Accepted
time: 877ms
memory: 3960kb

input:

10
10?9?9?8?10??9??9??1000?0
???7?3??99???9986?4???99?
?9?4???????????9???????04
??????9??????7????0???0??
??1??4?????419?4?2004?2?1
999???7??9?9???000??80000
???9???4??????0???40??0?0
?5?????5??????????7????4?
????8?????????0??000???0?
??????7??????????9?????0?

output:

887888873
275445479
5952172
5678
209875
11488878
72092077
1515
488880
6790

result:

ok 10 lines

Test #22:

score: 0
Accepted
time: 850ms
memory: 3892kb

input:

10
9?7?9?8?9891???1????9???9
7?1?9?8914??9915?0????0?1
????19?????????2??3?0????
?9?99729?????9?99930?0?03
9?9???64????99??8?6??9?9?
?9?7?41????4?199?9?42?0??
15?99997???99??????99999?
0999?7??099??8?7??9?9????
7689999??97?768??99??9???
39??9??9?4??00?000400?000

output:

6839
5378877
483
1688872
248146848
29828872
109688866
125688868
226398760
494155822

result:

ok 10 lines

Test #23:

score: 0
Accepted
time: 868ms
memory: 3936kb

input:

10
399?972?999?82?999?924000
?4???9??99?87485???9?????
??2????9?99?98?56??9??999
99998?7?999?9995800000?00
?68???0?17???7??????7????
?????7???????3?????3?????
4974??4?95005??50?503??4?
????79??0?80??0?8??????0?
4????9????9999?????9?999?
?????99???8?99??926???00?

output:

15688870
470575554
195644357
987205107
125
268
1381
2283
148888849
305300167

result:

ok 10 lines

Test #24:

score: 0
Accepted
time: 850ms
memory: 3684kb

input:

10
??98?9??0???130?????04???
713999998139999991?0?00?0
97?691?99866919?99???20??
9?79?99?8??9?99910?009100
3?99?7?9999839?99?4?0000?
?756856???05715?2??35??5?
65?9?9?9?8??00???038660?0
????9??????99?9?????009??
973?899?3???99?7?00037900
??8??9999??9?9999?99???0?

output:

783
100888873
524248872
5348875
2288872
1592
613847821
5883474
2162876
820490516

result:

ok 10 lines

Test #25:

score: 0
Accepted
time: 915ms
memory: 3696kb

input:

10
??7?9?99?699????000007000
???9?????9??9????????????
?99???99????000??0?0?000?
?4????4?9???9??4??0?4????
??1????????2????0???0?027
????????????91??????100??
99999?25299?99?252999??92
79999779999??9?99?8??0?0?
??82???9999??0???0??0?0?0
?????63?9??9??90????????0

output:

4088875
177
5888879
213380
802547346
489428
169400160
4688872
228888879
6563611

result:

ok 10 lines

Test #26:

score: -100
Wrong Answer
time: 852ms
memory: 3692kb

input:

10
999?9?73????9??8??9?9??99
99?9746?9??9984?4999?9??6
??9??9?96????00??0?6?5???
79??7?99987?99980?0??0?0?
??997?99??9??9999?9??0?00
?349??234???????99?3??002
?986999999?70??00?0700???
99?9999?300???0???00???0?
???8?0??9???????4??00???3
7?646988646998?4700864?01

output:

682400159
80911455
53005937
388875
68888871
1298872
548888879
60644530
2306880
5077077

result:

wrong answer 5th lines differ - expected: '12888871', found: '68888871'