Problem p02702 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <functional>
#include <iostream>
using namespace __gnu_pbds;
using namespace std;
// Declaring ordered_set
typedef tree<long long int, null_type, less<long long int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
// https://www.geeksforgeeks.org/order_of_key-in-c/

typedef pair<long long int, long long int> pa;

#define resize(A) A.resize(unique(A.begin(), A.end()) - A.begin())
#define pb push_back
#define MAX 200005

#define endl "\\n" // Take care in case of interactive problems

long long int mod = 998244353;
long long int MOD = 1e9 + 7;
long long int INF = 1e17;

////////////////////////////////////////////// sieve
/////////////////////////////////////////////////////////////////////
/*
 bool C[MAX];

 void sieve()
 {
    long long int i,j;
    for(i=2;i<MAX;i++)
    {
      if(!C[i])
     {


        for(j=2*i;j<MAX;j=j+i)
        {
            C[j]=true;

        }
      }

    }

 }*/

//////////////////////////////////////////////////////////D-S-U/////////////////////////////////////////////////////////
/*long long int parent[MAX];
long long int size[MAX];
void initialise()
{ //cout<<MAX<<" ";
    for(long  long int i=0;i<MAX;i++)
    {
        parent[i]=i;

        size[i]=1;
    }
}
long long int  root(long long int x)
{
    while(x!=parent[x])
    {
        parent[x]=parent[parent[x]];
        x=parent[x];
    }
    return x;
}


void union1(long long int x,long long int y)
{
    if(y>x)
    {
        size[x]+=size[y];
        parent[y]=x;

    }
    else
    {
        size[y]+=size[x];
        parent[x]=y;
    }
}*/
//////////////////////////////////////////////////////MODPOWER//////////////////////////////////////////////////////////

/*long long int modulo(long long int a,long long  int b, long long int n){
    long long int  x=1, y=a%n;
    while (b > 0) {
        if (b%2 == 1) {
            x = (x*y) % n; // multiplying with base
        }
        y = (y*y) % n; // squaring the base
        b /= 2;
    }
    return x % n;
}*/

////////////////////////////////////////////////BIT/////////////////////////////////////////////////////////////////////
/*long long int bit[MAX+1]={0};
long long int query(long long int in,long long int n)
{
   //in=in+1;
   long long int sum=0;
   if(in==0)
       return 0;
   while(in>0)
   {
     sum=sum+bit[in];

       in=in-(in&(-in));
   }
   return sum;
}
void update(long long int in,long long int n,long long int val)
{
   // in=in+1;

   while(in<=n)
   {
      // cout<<in<<" ";
       bit[in]+=val;
       in=in+ (in &(-in));
   }
}



*/

//////////////////////////////////////////////// DFS
/////////////////////////////////////////////////////////////////////
/*
  bool visited[MAX];
 long long int parent[MAX];
 long long int dist[MAX];


void dfs(vector<long long int>adj[],long long int i,long long int k)
{
    visited[i]=true;
    for(auto j:adj[i])
    {
        if(!visited[j])
        {
            dist[j]=dist[i]+1;
            parent[j]=i;
            dfs(adj,j,k);

        }

    }
}
 */

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// long long int R[4]={1,0,-1,0};
// long long int C[4]={0,1,0,-1};

// NEVER GONNA GIVE YOU UP, NEVER GONNA LET YOU DOWN!
long long int fun(long long int C[], long long int D[], long long int y,
                  long long int high) {
  long long int low, mid, ans;
  ans = 0;
  low = 1;
  while (low <= high) {
    mid = (low + high) / 2;
    if (D[mid] > y) {
      low = mid + 1;
      ans = max(ans, mid);
    } else
      high = mid - 1;
  }
  return ans;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long int sum, d, i, w, j,
      k = 0, l = 0, r = 0, m, n, c, p = 0, cnt = 0, cnt1 = 0, x, y = 0, z = 0,
      a, b, low, mid, high, ans = 0, ans1 = 0, maxi = 0, mini = INF, t1, x1, y1,
      t, o, i1;
  string s, s1, s2, s3;
  long long qt, xxx, k1;
  char kk, aa, bb, jj;

  cin >> s;
  n = s.size();
  vector<long long int> A(2019, 0);
  A[0]++;
  for (i = 0; i < n; i++) {

    vector<long long int> B(2019, 0);
    x = s[i] - '0';
    for (j = 0; j < 2019; j++) {
      B[(j * 10 + x) % 2019] += A[j];
    }
    cnt += B[0];
    for (j = 0; j < 2019; j++) {
      A[j] = B[j];
    }
    A[0]++;
  }
  cout << cnt << endl;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <functional>
#include <iostream>
using namespace __gnu_pbds;
using namespace std;
// Declaring ordered_set
typedef tree<long long int, null_type, less<long long int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
// https://www.geeksforgeeks.org/order_of_key-in-c/

typedef pair<long long int, long long int> pa;

#define resize(A) A.resize(unique(A.begin(), A.end()) - A.begin())
#define pb push_back
#define MAX 200005

#define endl "\\n" // Take care in case of interactive problems

long long int mod = 998244353;
long long int MOD = 1e9 + 7;
long long int INF = 1e17;

////////////////////////////////////////////// sieve
/////////////////////////////////////////////////////////////////////
/*
 bool C[MAX];

 void sieve()
 {
    long long int i,j;
    for(i=2;i<MAX;i++)
    {
      if(!C[i])
     {


        for(j=2*i;j<MAX;j=j+i)
        {
            C[j]=true;

        }
      }

    }

 }*/

//////////////////////////////////////////////////////////D-S-U/////////////////////////////////////////////////////////
/*long long int parent[MAX];
long long int size[MAX];
void initialise()
{ //cout<<MAX<<" ";
    for(long  long int i=0;i<MAX;i++)
    {
        parent[i]=i;
        //cout<<i<<" ";
        size[i]=1;
    }
}
long long int  root(long long int x)
{
    while(x!=parent[x])
    {
        parent[x]=parent[parent[x]];
        x=parent[x];
    }
    return x;
}


void union1(long long int x,long long int y)
{
    if(size[x]>=size[y])
    {
        size[x]+=size[y];
        parent[y]=x;

    }
    else
    {
        size[y]+=size[x];
        parent[x]=y;
    }
}*/
//////////////////////////////////////////////////////MODPOWER//////////////////////////////////////////////////////////

/*long long int modulo(long long int a,long long  int b, long long int n){
    long long int  x=1, y=a%n;
    while (b > 0) {
        if (b%2 == 1) {
            x = (x*y) % n; // multiplying with base
        }
        y = (y*y) % n; // squaring the base
        b /= 2;
    }
    return x % n;
}*/

////////////////////////////////////////////////BIT/////////////////////////////////////////////////////////////////////
/*long long int bit[MAX+1]={0};
long long int query(long long int in,long long int n)
{
   //in=in+1;
   long long int sum=0;
   if(in==0)
       return 0;
   while(in>0)
   {
     sum=sum+bit[in];

       in=in-(in&(-in));
   }
   return sum;
}
void update(long long int in,long long int n,long long int val)
{
   // in=in+1;

   while(in<=n)
   {
      // cout<<in<<" ";
       bit[in]+=val;
       in=in+ (in &(-in));
   }
}



*/

//////////////////////////////////////////////// DFS
/////////////////////////////////////////////////////////////////////
/*
  bool visited[MAX];
 long long int parent[MAX];
 long long int dist[MAX];


void dfs(vector<long long int>adj[],long long int i,long long int k)
{
    visited[i]=true;
    for(auto j:adj[i])
    {
        if(!visited[j])
        {
            dist[j]=dist[i]+1;
            parent[j]=i;
            dfs(adj,j,k);

        }

    }
}
 */

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// long long int R[4]={1,0,-1,0};
// long long int C[4]={0,1,0,-1};

// NEVER GONNA GIVE YOU UP, NEVER GONNA LET YOU DOWN!

int X[MAX][2019];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long int sum, d, i, w, j,
      k = 0, l = 0, r = 0, m, n, c, p = 0, cnt = 0, cnt1 = 0, x, y = 0, z = 0,
      a, b, low, mid, high, ans = 0, ans1 = 0, maxi = 0, mini = INF, t1, x1, y1,
      t, o, i1;
  string s, s1, s2, s3;
  long long qt, xxx, k1;
  char kk, aa, bb, jj;

  // string s;
  cin >> s;
  n = s.size();
  set<long long int> se[n];
  for (i = 0; i < n; i++) {
    x = 0;
    y = 0;
    for (j = i; j < n; j++) {
      l = s[j];
      l = l - 48;
      x = (x * 10 + l) % 2019;
      if (X[j][x] != 0)
        break;
      X[j][x]++;

      if (x == 0) {
        y++;
      }
    }
    cnt += (y * (y + 1)) / 2;
  }

  cout << cnt;
}