import java.io.*;
import java.util.*;
public class Main {
static class EntradaRapida {
private final byte[] buffer = new byte[1 << 16];
private int indice = 0;
private int limite = 0;
if (indice >= limite) {
limite = flujoEntrada.read(buffer);
indice = 0;
if (limite <= 0) return -1;
}
return buffer[indice++];
}
int simbolo;
do {
simbolo = leer();
if (simbolo == -1) return -1;
} while (simbolo <= 32);
int numero = 0;
while (simbolo > 32) {
numero = numero * 10 + simbolo - '0';
simbolo = leer();
}
return numero;
}
StringBuilder cadenaLeida = new StringBuilder();
int simbolo;
do {
simbolo = leer();
if (simbolo == -1) return null;
} while (simbolo <= 32);
while (simbolo > 32) {
cadenaLeida.append((char) simbolo);
simbolo = leer();
}
return cadenaLeida.toString();
}
}
static int[] ordenarSufijos(int[] secuencia) {
int tamano = secuencia.length;
int[] sufijos = new int[tamano];
int[] clases = new int[tamano];
int[] auxiliar = new int[tamano];
int[] clasesNuevas = new int[tamano];
int[] frecuencias
= new int[Math.
max(tamano,
28)];
for (int simbolo : secuencia) {
frecuencias[simbolo]++;
}
for (int i = 1; i < 28; i++) {
frecuencias[i] += frecuencias[i - 1];
}
for (int i = tamano - 1; i >= 0; i--) {
sufijos[--frecuencias[secuencia[i]]] = i;
}
int totalClases = 1;
clases[sufijos[0]] = 0;
for (int i = 1; i < tamano; i++) {
if (secuencia[sufijos[i]] != secuencia[sufijos[i - 1]]) {
totalClases++;
}
clases[sufijos[i]] = totalClases - 1;
}
for (int distancia = 1; distancia < tamano; distancia <<= 1) {
for (int i = 0; i < tamano; i++) {
auxiliar[i] = sufijos[i] - distancia;
if (auxiliar[i] < 0) {
auxiliar[i] += tamano;
}
}
Arrays.
fill(frecuencias,
0, totalClases,
0);
for (int i = 0; i < tamano; i++) {
frecuencias[clases[auxiliar[i]]]++;
}
for (int i = 1; i < totalClases; i++) {
frecuencias[i] += frecuencias[i - 1];
}
for (int i = tamano - 1; i >= 0; i--) {
int indice = auxiliar[i];
int claseActual = clases[indice];
sufijos[--frecuencias[claseActual]] = indice;
}
clasesNuevas[sufijos[0]] = 0;
int nuevasClases = 1;
for (int i = 1; i < tamano; i++) {
int sufijoActual = sufijos[i];
int sufijoAnterior = sufijos[i - 1];
int segundaParteActual =
(sufijoActual + distancia) % tamano;
int segundaParteAnterior =
(sufijoAnterior + distancia) % tamano;
if (clases[sufijoActual] != clases[sufijoAnterior] ||
clases[segundaParteActual] !=
clases[segundaParteAnterior]) {
nuevasClases++;
}
clasesNuevas[sufijoActual] = nuevasClases - 1;
}
int[] intercambio = clases;
clases = clasesNuevas;
clasesNuevas = intercambio;
totalClases = nuevasClases;
if (totalClases == tamano) {
break;
}
}
return sufijos;
}
static int[] calcularLcp(int[] secuencia, int[] sufijos) {
int tamano = secuencia.length;
int[] rangoSufijos = new int[tamano];
int[] prefijosComunes = new int[tamano];
for (int i = 0; i < tamano; i++) {
rangoSufijos[sufijos[i]] = i;
}
int longitudCompartida = 0;
for (int i = 0; i < tamano; i++) {
int rangoActual = rangoSufijos[i];
if (rangoActual == 0) {
longitudCompartida = 0;
continue;
}
int sufijoAnterior = sufijos[rangoActual - 1];
while (i + longitudCompartida < tamano &&
sufijoAnterior + longitudCompartida < tamano &&
secuencia[i + longitudCompartida] ==
secuencia[sufijoAnterior + longitudCompartida]) {
longitudCompartida++;
}
prefijosComunes[rangoActual] = longitudCompartida;
if (longitudCompartida > 0) {
longitudCompartida--;
}
}
return prefijosComunes;
}
static int[] construirTexto(
int tamanoCadena
) {
int[] secuencia = new int[4 * tamanoCadena + 2];
int inicioSegunda = 2 * tamanoCadena + 1;
for (int indice = 0; indice < tamanoCadena; indice++) {
int codigoPrimera =
primeraCadena.charAt(indice) - 'a' + 2;
int codigoSegunda =
segundaCadena.charAt(indice) - 'a' + 2;
secuencia[indice] = codigoPrimera;
secuencia[indice + tamanoCadena] = codigoPrimera;
secuencia[inicioSegunda + indice] = codigoSegunda;
secuencia[inicioSegunda + tamanoCadena + indice] =
codigoSegunda;
}
secuencia[2 * tamanoCadena] = 1;
secuencia[4 * tamanoCadena + 1] = 0;
return secuencia;
}
static long contarPares(
int tamanoCadena,
int[] sufijos,
int[] prefijosComunes
) {
int inicioSegunda = 2 * tamanoCadena + 1;
int ultimoValido = -1;
int primeraCantidad = 0;
int segundaCantidad = 0;
int minimoCompartido
= Integer.
MAX_VALUE;
long primeraAcumulada = 0;
long totalPares = 0;
for (int indice = 0; indice < sufijos.length; indice++) {
if (ultimoValido != -1 && indice > ultimoValido) {
minimoCompartido
= Math.
min( minimoCompartido,
prefijosComunes[indice]
);
}
int sufijo = sufijos[indice];
boolean esPrimera = sufijo < tamanoCadena;
boolean esSegunda =
sufijo >= inicioSegunda &&
sufijo < inicioSegunda + tamanoCadena;
if (!esPrimera && !esSegunda) {
continue;
}
if (ultimoValido == -1 || minimoCompartido < tamanoCadena) {
totalPares += primeraAcumulada * segundaCantidad;
totalPares +=
(long) primeraCantidad * segundaCantidad;
primeraAcumulada += primeraCantidad;
primeraCantidad = 0;
segundaCantidad = 0;
}
if (esPrimera) {
primeraCantidad++;
} else {
segundaCantidad++;
}
ultimoValido = indice;
minimoCompartido
= Integer.
MAX_VALUE; }
totalPares += primeraAcumulada * segundaCantidad;
totalPares +=
(long) primeraCantidad * segundaCantidad;
return totalPares;
}
static long resolver(
int tamanoCadena,
) {
int[] secuencia = construirTexto(
primeraCadena,
segundaCadena,
tamanoCadena
);
int[] sufijos = ordenarSufijos(secuencia);
int[] prefijosComunes = calcularLcp(secuencia, sufijos);
return contarPares(
tamanoCadena,
sufijos,
prefijosComunes
);
}
EntradaRapida lector = new EntradaRapida();
int tamanoCadena = lector.leerEntero();
if (tamanoCadena == -1) return;
String primeraCadena
= lector.
leerCadena(); String segundaCadena
= lector.
leerCadena();
resolver(tamanoCadena, primeraCadena, segundaCadena)
);
}
}