import java.io.*;
import java.util.*;
public class Main {
static class EntradaRapida {
private final byte[] buffer = new byte[1 << 16];
private int posicion = 0;
private int cantidad = 0;
if (posicion >= cantidad) {
cantidad = entrada.read(buffer);
posicion = 0;
if (cantidad <= 0) return -1;
}
return buffer[posicion++];
}
int caracter;
do {
caracter = leer();
if (caracter == -1) return -1;
} while (caracter <= 32);
int numero = 0;
while (caracter > 32) {
numero = numero * 10 + caracter - '0';
caracter = leer();
}
return numero;
}
StringBuilder resultado = new StringBuilder();
int caracter;
do {
caracter = leer();
if (caracter == -1) return null;
} while (caracter <= 32);
while (caracter > 32) {
resultado.append((char) caracter);
caracter = leer();
}
return resultado.toString();
}
}
static int[] construirSuffixArray(int[] texto) {
int longitud = texto.length;
int[] sufijos = new int[longitud];
int[] clases = new int[longitud];
int[] auxiliar = new int[longitud];
int[] nuevasClases = new int[longitud];
int maximoSimbolo = 0;
for (int valor : texto) {
maximoSimbolo
= Math.
max(maximoSimbolo, valor
); }
int[] frecuencias = new int[
Math.
max(longitud, maximoSimbolo
+ 1) ];
for (int valor : texto) {
frecuencias[valor]++;
}
for (int i = 1; i <= maximoSimbolo; i++) {
frecuencias[i] += frecuencias[i - 1];
}
for (int i = longitud - 1; i >= 0; i--) {
sufijos[--frecuencias[texto[i]]] = i;
}
int cantidadClases = 1;
clases[sufijos[0]] = 0;
for (int i = 1; i < longitud; i++) {
if (texto[sufijos[i]] != texto[sufijos[i - 1]]) {
cantidadClases++;
}
clases[sufijos[i]] = cantidadClases - 1;
}
for (int distancia = 1;
distancia < longitud;
distancia <<= 1) {
for (int i = 0; i < longitud; i++) {
auxiliar[i] = sufijos[i] - distancia;
if (auxiliar[i] < 0) {
auxiliar[i] += longitud;
}
}
Arrays.
fill(frecuencias,
0, cantidadClases,
0);
for (int i = 0; i < longitud; i++) {
frecuencias[clases[auxiliar[i]]]++;
}
for (int i = 1; i < cantidadClases; i++) {
frecuencias[i] += frecuencias[i - 1];
}
for (int i = longitud - 1; i >= 0; i--) {
int indice = auxiliar[i];
int clase = clases[indice];
sufijos[--frecuencias[clase]] = indice;
}
nuevasClases[sufijos[0]] = 0;
int totalNuevasClases = 1;
for (int i = 1; i < longitud; i++) {
int actual = sufijos[i];
int anterior = sufijos[i - 1];
int segundoActual = actual + distancia;
int segundoAnterior = anterior + distancia;
if (segundoActual >= longitud) {
segundoActual -= longitud;
}
if (segundoAnterior >= longitud) {
segundoAnterior -= longitud;
}
if (clases[actual] != clases[anterior] ||
clases[segundoActual] != clases[segundoAnterior]) {
totalNuevasClases++;
}
nuevasClases[actual] = totalNuevasClases - 1;
}
int[] intercambio = clases;
clases = nuevasClases;
nuevasClases = intercambio;
cantidadClases = totalNuevasClases;
if (cantidadClases == longitud) {
break;
}
}
return sufijos;
}
static int[] construirLCP(int[] texto, int[] sufijos) {
int longitud = texto.length;
int[] posiciones = new int[longitud];
int[] lcp = new int[longitud];
for (int i = 0; i < longitud; i++) {
posiciones[sufijos[i]] = i;
}
int compartidos = 0;
for (int i = 0; i < longitud; i++) {
int rango = posiciones[i];
if (rango == 0) {
compartidos = 0;
continue;
}
int anterior = sufijos[rango - 1];
while (i + compartidos < longitud &&
anterior + compartidos < longitud &&
texto[i + compartidos] ==
texto[anterior + compartidos]) {
compartidos++;
}
lcp[rango] = compartidos;
if (compartidos > 0) {
compartidos--;
}
}
return lcp;
}
static int[] construirTexto(
int n
) {
int[] texto = new int[4 * n + 2];
int inicioT = 2 * n + 1;
for (int i = 0; i < n; i++) {
int simboloS = cadenaS.charAt(i) + 2;
int simboloT = cadenaT.charAt(i) + 2;
texto[i] = simboloS;
texto[i + n] = simboloS;
texto[inicioT + i] = simboloT;
texto[inicioT + n + i] = simboloT;
}
texto[2 * n] = 1;
texto[4 * n + 1] = 0;
return texto;
}
static long contarPares(
int n,
int[] sufijos,
int[] lcp
) {
int inicioT = 2 * n + 1;
int grupoS = 0;
int grupoT = 0;
int anteriorSeleccionado = -1;
long acumuladoS = 0;
long respuesta = 0;
for (int i = 0; i < sufijos.length; i++) {
if (anteriorSeleccionado != -1) {
minimoLCP
= Math.
min(minimoLCP, lcp
[i
]); }
int posicion = sufijos[i];
boolean esS = posicion < n;
boolean esT =
posicion >= inicioT &&
posicion < inicioT + n;
if (!esS && !esT) {
continue;
}
if (anteriorSeleccionado == -1 ||
minimoLCP < n) {
respuesta += acumuladoS * grupoT;
respuesta += (long) grupoS * grupoT;
acumuladoS += grupoS;
grupoS = 0;
grupoT = 0;
}
if (esS) {
grupoS++;
} else {
grupoT++;
}
anteriorSeleccionado = i;
}
respuesta += acumuladoS * grupoT;
respuesta += (long) grupoS * grupoT;
return respuesta;
}
static long resolver(
int n,
) {
int[] texto = construirTexto(cadenaS, cadenaT, n);
int[] sufijos = construirSuffixArray(texto);
int[] lcp = construirLCP(texto, sufijos);
return contarPares(n, sufijos, lcp);
}
EntradaRapida lector = new EntradaRapida();
int n = lector.leerEntero();
if (n == -1) return;
String cadenaS
= lector.
leerCadena(); String cadenaT
= lector.
leerCadena();
if (cadenaS == null || cadenaT == null ||
cadenaS.length() != n || cadenaT.length() != n) {
return;
}
System.
out.
println(resolver
(n, cadenaS, cadenaT
)); }
}