Pregunta B: JJOOII 2 -------------------------------- Pensamiento

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:

  1. Utiliza la Operación 1 y S se convierte en JIJOIOIIJ.
  2. Utiliza la Operación 2 y S se convierte en JIJOIOII.
  3. Utiliza la Operación 3 para eliminar el segundo personaje y S se convierte en JJOIOII.
  4. 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;
	
}
572 artículos originales publicados · elogiados 14 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43690454/article/details/105273630
Recomendado
Clasificación