Duda sobre un error

Estoy intentando resolver este problema.
Esta es parte de mi solución (faltan los casos en los que la palabra se lee de derecha a izquierda y en los que no se lee)

Summary
#include <iostream>
#include <vector>
using namespace std;
int main(){
	
	int n; cin >> n;
	vector<char> mensaje (n);
	string mensajev2;
	for(int i=0;i<n;i++){
		cin >> mensaje[i];
		mensajev2+=mensaje[i];
	}
	string x; cin >> x;
	int p=x.size();
	for(int i=0;i<n;i++){
		if(i<=n-p){
			string y=mensajev2.substr(i, i+(p-1));
			if(y==x){
				cout << "SI" << endl;
				cout << "I";
			}
		}
	}
}

Este programa funciona para todos los casos excepto cuando la palabra se encuentra al comienzo del vector. Alguien podría decirme porqué sucede esto?

¡Hola! Edité tu post para que el foro haga Syntax Highlighting (o sea, que pinte de colores el código). Para eso basta con poner tres comillas hacia atrás (" ` ") al comienzo del código, y luego tres más al final. Se pueden ver otros tips de cómo lograr formatos simpáticos en el foro, en este tema: Formato y Escritura en el Foro

Sobre el código: El tema está en el fragmento mensajev2.substr(i, i+(p-1)); : En esa parte, el segundo parámetro a substr en C++ tiene que ser la cantidad de caracteres a seleccionar, es decir, la longitud de la subcadena. Esto es a diferencia de algunos otros lenguajes (Notablemente, Java y Python). Acá se puede consultar el funcionamiento de la función substr (y muchas otras) http://www.cplusplus.com/reference/string/string/substr/

En este caso, no creo que funcione en todos los casos menos en el que describís, sino que es medio al azar en cuáles funciona y en cuáles no, porque por cómo llamás a la función, se terminan comparando subcadenas muy raras :P. Algo con lo que quizás debas tener cuidado es con la posibilidad de que la cadena aparezca más de una vez (como por ejemplo "abc" dentro de "abcabcabc").

Sobre el código, un detalle es que no hace falta (pero como está funciona y no tiene nada mal) tener separado el vector<char> mensaje;, porque solamente lo usás para tener un caracter individual mensaje[i] durante la construcción del string mensajev2. Con lo cual podrías usar una sola variable local de tipo char adentro del for, para leer ese caracter y agregarlo al string (ya que ahí adentro es el único lugar donde se usa el vector mensaje, y se usa siempre de a un caracter por vez).

Comentario aparte: en este programa de una competición vieja se especifica que hay que leer y escribir de archivos. Esto es prácticamente igual a leer y escribir los datos con cin y cout: en el curso básico de C++ de la wiki está explicado:

wiki.oia.unsam.edu.ar/curso-cpp/archivos

1 me gusta

Gracias por la respuesta!