#include <iostream> #include <string> using namespace std; void increment(string &str){ for(int i=str.size()-1;i>=0;i--) if(str[i]=='9') str[i]='0'; else{ str[i]++; break; } } int string_mode_func(string &act, string &last){ if(act.size()>last.size()) return 0; int status=0,res=0; for(int i=0;i<act.size();i++) if(act[i]<last[i]){ status=1; break; } else if(act[i]>last[i]){ status=2; break; } if(status==1){ //prefix mniejszy - wydłużamy stringa res += last.size()-act.size()+1; while(act.size()<=last.size()) act.push_back('0'); } else if(status==2){ //prefix wiekszy - dopychamy zerami res += last.size()-act.size(); while(act.size()<last.size()) act.push_back('0'); } else{ //prefix równy = przepisujemy, próbujemy zwiększyć o 1, jak nie to wydłużamy bool non_nine=false; for(int i=act.size();i<last.size();i++) if(last[i]!='9'){ non_nine=true; break; } if(non_nine){ //można kopiować i zwiększyć res += last.size()-act.size(); for(int i=act.size();i<last.size();i++) act.push_back(last[i]); increment(act); } else{ //jednak wydłużamy stringa res += last.size()-act.size()+1; while(act.size()<=last.size()) act.push_back('0'); } } return res; } void go_clever(string &act, string &left, int &mid, string &right){ left = act.substr(0, 10); mid = act.size()-17; right = act.substr(act.size()-7, string::npos); } void clever_mode_func(string &act, string &left, int &mid, string &right){ int status=0; for(int i=0;i<act.size();i++) if(act[i]<left[i]){ status=1; break; } else if(act[i]>left[i]){ status=2; break; } if(status==1){ //liczba mniejsza od starej - wydłużamy string mid++; right="0000000"; left=act; while(left.size()<10) left.push_back('0'); } else if(status==2){ //liczba większa od starej - zerujemy końcówkę right="0000000"; left=act; while(left.size()<10) left.push_back('0'); } else{ //liczba równa starej - zwiększamy prawą stronę increment(right); } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); long long result=0; int n; cin >> n; bool mode = false; //false = string mode, true = clever mode string last; //string mode variables string left, right; int mid; //clever mode variables int x; cin >> x; last = to_string(x); while(--n){ int x; cin >> x; string act = to_string(x); //string mode if(!mode){ result += string_mode_func(act, last); //cerr << "After=" << act << " r=" << result << endl; last = act; if(last.size()>=20){ mode=true; go_clever(act, left, mid, right); //cerr << "Going clever: left=" << left << " mid=" << mid << " right=" << right << endl; } } //clever mode else{ clever_mode_func(act, left, mid, right); result += 17+mid - act.size(); } } cout << result << "\n"; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | #include <iostream> #include <string> using namespace std; void increment(string &str){ for(int i=str.size()-1;i>=0;i--) if(str[i]=='9') str[i]='0'; else{ str[i]++; break; } } int string_mode_func(string &act, string &last){ if(act.size()>last.size()) return 0; int status=0,res=0; for(int i=0;i<act.size();i++) if(act[i]<last[i]){ status=1; break; } else if(act[i]>last[i]){ status=2; break; } if(status==1){ //prefix mniejszy - wydłużamy stringa res += last.size()-act.size()+1; while(act.size()<=last.size()) act.push_back('0'); } else if(status==2){ //prefix wiekszy - dopychamy zerami res += last.size()-act.size(); while(act.size()<last.size()) act.push_back('0'); } else{ //prefix równy = przepisujemy, próbujemy zwiększyć o 1, jak nie to wydłużamy bool non_nine=false; for(int i=act.size();i<last.size();i++) if(last[i]!='9'){ non_nine=true; break; } if(non_nine){ //można kopiować i zwiększyć res += last.size()-act.size(); for(int i=act.size();i<last.size();i++) act.push_back(last[i]); increment(act); } else{ //jednak wydłużamy stringa res += last.size()-act.size()+1; while(act.size()<=last.size()) act.push_back('0'); } } return res; } void go_clever(string &act, string &left, int &mid, string &right){ left = act.substr(0, 10); mid = act.size()-17; right = act.substr(act.size()-7, string::npos); } void clever_mode_func(string &act, string &left, int &mid, string &right){ int status=0; for(int i=0;i<act.size();i++) if(act[i]<left[i]){ status=1; break; } else if(act[i]>left[i]){ status=2; break; } if(status==1){ //liczba mniejsza od starej - wydłużamy string mid++; right="0000000"; left=act; while(left.size()<10) left.push_back('0'); } else if(status==2){ //liczba większa od starej - zerujemy końcówkę right="0000000"; left=act; while(left.size()<10) left.push_back('0'); } else{ //liczba równa starej - zwiększamy prawą stronę increment(right); } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); long long result=0; int n; cin >> n; bool mode = false; //false = string mode, true = clever mode string last; //string mode variables string left, right; int mid; //clever mode variables int x; cin >> x; last = to_string(x); while(--n){ int x; cin >> x; string act = to_string(x); //string mode if(!mode){ result += string_mode_func(act, last); //cerr << "After=" << act << " r=" << result << endl; last = act; if(last.size()>=20){ mode=true; go_clever(act, left, mid, right); //cerr << "Going clever: left=" << left << " mid=" << mid << " right=" << right << endl; } } //clever mode else{ clever_mode_func(act, left, mid, right); result += 17+mid - act.size(); } } cout << result << "\n"; return 0; } |