#include <bits/stdc++.h>
using namespace std;
const double pi = acos(0.0) * 2.0;
const double eps = 1e-12;
const int step[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
template <class T>
inline T abs1(T a) {
  return a < 0 ? -a : a;
}
template <class T>
inline T max1(T a, T b) {
  return a > b ? a : b;
}
template <class T>
inline T min1(T a, T b) {
  return a < b ? a : b;
}
template <class T>
inline T gcd1(T a, T b) {
  if (a < b) swap(a, b);
  if (a % b == 0) return b;
  return gcd1(b, a % b);
}
template <class T>
inline T lb(T num) {
  return num & (-num);
}
inline int jud(double a, double b) {
  if (abs1(a - b) < eps) return 0;
  if (a < b) return -1;
  return 1;
}
template <class t>
inline int find(int val, t *a, int na, bool f_small = 1, bool f_lb = 1) {
  if (na == 1) return 0;
  int be = 0, en = na - 1;
  if (a[0] <= a[na - 1]) {
    if (f_lb == 0)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(a[mid], val) != 1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(a[mid], val) != -1)
          en = mid;
        else
          be = mid + 1;
      }
    if (f_small && a[be] > val && be != 0) be--;
    if (!f_small && a[be] < val && be != na - 1) be++;
  } else {
    if (f_lb)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(a[mid], val) != -1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(a[mid], val) != 1)
          en = mid;
        else
          be = mid + 1;
      }
    if (!f_small && a[be] < val && be != 0) be--;
    if (f_small && a[be] > val && be != na - 1) be++;
  }
  return be;
}
inline int bitnum(unsigned long long nValue) {
  nValue = ((0xaaaaaaaaaaaaaaaaull & nValue) >> 1) +
           (0x5555555555555555ull & nValue);
  nValue = ((0xccccccccccccccccull & nValue) >> 2) +
           (0x3333333333333333ull & nValue);
  nValue = ((0xf0f0f0f0f0f0f0f0ull & nValue) >> 4) +
           (0x0f0f0f0f0f0f0f0full & nValue);
  nValue = ((0xff00ff00ff00ff00ull & nValue) >> 8) +
           (0x00ff00ff00ff00ffull & nValue);
  nValue = ((0xffff0000ffff0000ull & nValue) >> 16) +
           (0x0000ffff0000ffffull & nValue);
  nValue = ((0xffffffff00000000ull & nValue) >> 32) +
           (0x00000000ffffffffull & nValue);
  return nValue;
}
long long pow(long long n, long long m, long long mod = 0) {
  long long ans = 1;
  long long k = n;
  while (m) {
    if (m & 1) {
      ans *= k;
      if (mod) ans %= mod;
    }
    k *= k;
    if (mod) k %= mod;
    m >>= 1;
  }
  return ans;
}
const int maxn = 1100100;
const char dic[3] = {'R', 'G', 'B'};
int nxt[2][maxn], head[3][2];
int dp[2][maxn];
int count1[2][3][3][maxn];
char str[2][maxn];
int l[2];
inline int mp(char ch) {
  if (ch == 'R') return 0;
  if (ch == 'G') return 1;
  if (ch == 'B') return 2;
  return 0;
}
int main() {
  scanf("%s", str[0]);
  scanf("%s", str[1]);
  l[0] = strlen(str[0]), l[1] = strlen(str[1]);
  memset(head, -1, sizeof(head));
  for (int i = 0; i < 2; i++)
    for (int j = l[i] - 1; j >= 0; j--) {
      if (j != 0) count1[i][mp(str[i][j - 1])][mp(str[i][j])][j]++;
      nxt[i][j] = head[mp(str[i][j])][i];
      head[mp(str[i][j])][i] = j;
    }
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < 3; j++)
      for (int k = 0; k < 3; k++)
        for (int t = 1; t < l[i]; t++) {
          if (j == k)
            count1[i][j][k][t] = 0;
          else
            count1[i][j][k][t] += count1[i][j][k][t - 1];
        }
  long long ans = 0;
  int link[2] = {0};
  dp[0][0] = head[mp(str[0][0])][1];
  dp[1][0] = head[mp(str[1][0])][0];
  if (dp[0][0] == -1) dp[0][0] = l[1] - 1;
  if (dp[1][0] == -1) dp[1][0] = l[0] - 1;
  ans += dp[0][0] + dp[1][0] + 2;
  for (int i = 1; i < max1(l[0], l[1]); i++) {
    for (int j = 0; j < 2; j++) {
      if (i >= l[j]) continue;
      while (link[1 - j] < min1(i, l[1 - j]) && dp[1 - j][link[1 - j]] < i)
        link[1 - j]++;
      while (head[mp(str[j][i])][1 - j] != -1 &&
             head[mp(str[j][i])][1 - j] <= dp[j][i - 1])
        head[mp(str[j][i])][1 - j] = nxt[1 - j][head[mp(str[j][i])][1 - j]];
      if (head[mp(str[j][i])][1 - j] == -1)
        ans += max1(
            l[1 - j] - link[1 - j] -
                count1[1 - j][mp(str[j][i])][mp(str[j][i - 1])][l[1 - j] - 1] +
                count1[1 - j][mp(str[j][i])][mp(str[j][i - 1])][link[1 - j]],
            0),
            dp[j][i] = l[1 - j] - 1;
      else
        ans += head[mp(str[j][i])][1 - j] - link[1 - j] + 1 -
               count1[1 - j][mp(str[j][i])][mp(str[j][i - 1])]
                     [head[mp(str[j][i])][1 - j]] +
               count1[1 - j][mp(str[j][i])][mp(str[j][i - 1])][link[1 - j]],
            dp[j][i] = head[mp(str[j][i])][1 - j];
    }
  }
  cout << ans / 2 << endl;
  return 0;
}
