Descripiton
SOlution
不难发现 的长度最多为
。
对于一段不包含 的串,
- 需要满足条件
至少长度为
- 需要满足条件
至多长度为
即长度为 的串都可能为答案的贡献,对此我们可以暴力找出到底这一段有多长,因为这一段的长度不超过
。至于前导零,我们可以记录当前位置的前导零有多少个,记为
,那么贡献为
。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
string l, r, s;
string cal(int posl, int posr) {
string res;
for (int i = posl; i <= posr; i++) {
res += s[i];
}
return res;
}
bool Isgreater(string a, string b) { // a > b
if (a.size() > b.size()) return true;
if (a.size() < b.size()) return false;
for (int i = 0; i < a.size(); i++) {
if (a[i] > b[i]) {
return true;
} else if (a[i] < b[i]) {
return false;
}
}
return false;
}
bool Isless(string a, string b) { // a < b
if (a.size() < b.size()) return true;
if (a.size() > b.size()) return false;
for (int i = 0; i < a.size(); i++) {
if (a[i] < b[i]) {
return true;
} else if (a[i] > b[i]) {
return false;
}
}
return false;
}
void solve() {
cin >> l >> r >> s;
int n = l.size(), m = r.size(), k = s.size();
int pos = 0, leadzero = 0;
ll ans = 0;
while (pos + n - 1 < k) {
if (s[pos] == '0') {
leadzero++;
} else {
int left = pos + n - 1, right = min(k - 1, pos + m - 1);
string Lres = cal(pos, left), Rres = cal(pos, right);
while (Isgreater(l, Lres) && left < right) {
left++, Lres += s[left];
}
while (Isgreater(Rres, r) && right >= left) {
right--; Rres.pop_back();
}
//cout << "pos:" << pos << ' ' << "left:" <<left << ' ' << "right:" << right << '\n';
if (!Isgreater(Rres, r) && !Isless(Lres, l) && right >= left) {
ans += right - left + 1;
ans += 1LL * leadzero * (right - left + 1);
}
leadzero = 0;
}
pos++;
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int T = 1; //cin >> T;
while (T--) {
solve();
}
return 0;
} 
京公网安备 11010502036488号