Itar 描述
Bitaro recibió una cuerda S de longitud N por su regalo de cumpleaños. La cadena S consta de tres tipos de caracteres, J, O e I.
Para cada entero positivo K, llamaremos a la cadena que consta de K J, K O y KI en este orden JOI-cadena de nivel K. Para ejemplo, JJOOII es una cadena JOI de nivel 2. A
Bitaro le gusta una cadena JOI de nivel K, por lo que va a hacer una cadena JOI de nivel K a partir de la cadena S utilizando las siguientes tres operaciones cualquier número de veces en forma arbitraria orden: la
operación 1 Bitaro elimina el primer carácter de S.
La operación 2 Bitaro elimina el último personaje de S.
La operación 3 Bitaro elimina un carácter de S que no es ni el primero ni el último.
Debido a que el uso de la Operación 3 lleva mucho tiempo, Bitaro quiere hacer una cadena JOI de nivel K con el menor número de Operación 3 posible.
Escriba un programa que, dada una cadena S de longitud N y un entero positivo K, imprima el número más pequeño de Operación 3 requerido para hacer una cadena JOI de nivel K desde S. Si es imposible hacer una cadena JOI de nivel K con las operaciones, imprima - 1 en su lugar.
输入
Lea los siguientes datos de la entrada estándar. N y K son enteros. S es una cuerda. Restricciones
NK
S • 3 ≤ N ≤ 200 000. • 1 ≤ K ≤ N / 3. • S es una cadena de longitud N que consiste en J, O e I. 输出
Escriba una línea en la salida estándar. La salida debe contener el menor número de Operación 3 requerida para hacer una cadena JOI de nivel K desde S. Si es imposible hacer una cadena JOI de nivel K, imprima - 1 en su lugar.
copiar entrada de la muestra
[1] de la muestra
10 2
OJIJOIOIIJ
[muestra 2]
9 3.
JJJOOOIII
[muestra 3]
9 1.
IIIOOOJJJ
ejemplo de salida de copia
[muestra 1]
2
[muestra 2]
0
[muestra 3]
- 1
Consejo El
ejemplo 1 explica
Puede realizar una cadena JOI de nivel K a partir de la cadena S mediante las siguientes operaciones:
- Utiliza la Operación 1 y S se convierte en JIJOIOIIJ.
- Utiliza la Operación 2 y S se convierte en JIJOIOII.
- Utiliza la Operación 3 para eliminar el segundo personaje y S se convierte en JJOIOII.
- Utiliza la Operación 3 para eliminar el cuarto personaje y S se convierte en JJOOII.
Es imposible hacer una cadena JOI de nivel K con el uso de la Operación 3 menos de dos veces, por lo que debe imprimir 2.
El ejemplo 2 explica
que no necesita utilizar una operación.
样例 3 解释
En esta muestra, es imposible hacer una cadena JOI de nivel 1 a partir de la cadena S.
Análisis:
Mantener tres matrices. La
matriz mantiene: hacia dónde saltar cuando se procesa i para que haya k 'J', 'O', 'I' entre;
use la cola para procesar
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1000;
int n,k;
int a[N];
int nj[N],no[N],ni[N];
char s[N];
void get(int nx[],char c)
{
queue<int>q;int l=0;
for(int i=1;i<=n;i++) //预处理i位置跳到哪使得之间有k个 J,O,I;
{
if(s[i]==c)
{
q.push(i);
if(q.size()==k)
{
for(int j=l+1;j<=q.front();j++) nx[j]=i;
l=q.front();q.pop();
}
}
}
for(int i=l+1;i<=n;i++) nx[i]=1e9;
}
int main()
{
scanf("%d %d",&n,&k);
scanf("%s",(s+1));
get(nj,'J');get(no,'O');get(ni,'I');
int ans=1e9;
for(int i=1;i<=n;i++)
{
int j=nj[i]; if(j>n) continue;
j=no[j];if(j>n) continue;
j=ni[j];if(j>n) continue;
ans=min(ans,j-i+1-3*k);
}
if(ans==1e9) cout<<-1<<endl;
else cout<<ans<<endl;
}