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;
}