Copia – Incolla

Corso Online per Potenziare le Competenze Digitali

Arianna aveva appena terminato di scrivere una relazione, quando nel fare copia-incolla del testo, il tasto V della tastiera, responsabile dell’incollamento del testo, si è incastrato.
Per questo, in pochi secondi, Arianna ha incollato moltissime copie dello stesso testo.
La relazione è da consegnare domani, e il programma di videoscrittura che Arianna sta utilizzando non permette di annullare il cambiamento effettuato.
Aiuta la ragazza a determinare quale era il testo originale, ovvero quale è la più corta stringa s di cui il testo di Arianna è ripetizione.

Dati di input

Il file input.txt è composto da una riga, corrispondente alla situazione attuale del testo di Arianna.
La riga di testo può contenere spazi, lettere minuscole e maiuscole (dalla a alla z).

Dati di output

Il file output.txt è composto da un’unica riga contenente il testo originale che Arianna intendeva incollare.

Assunzioni

  • La lunghezza della riga di testo in input non supera i 1000 caratteri (se si usano gli array di char, fare attenzione ad allocare spazio sufficiente per il carattere terminatore!).
  • Non sono mai presenti spazi ai margini del testo in input.

Esempi di input/output

input.txt output.txt
ciaociaociao ciao
amo le roseamo le rose amo le rose

/*
 www.valcon.it
 Corso Online per Potenziare le Competenze Digitali
 Copia - Incolla
*/
#include
#include
#include      // compare() - length() - substr()

using namespace std;

int main()
{
    ifstream fin ( "input.txt");
    ofstream fout("output.txt");
    string s;
    getline(fin, s);
    int n=s.length();
    
    int risposta=0;
    string sottostr;
    for(int i=1; i <= n/2; i++)
    {
    	if(n%i == 0)
    	{
    		risposta=1;
    		sottostr=s.substr(0,i);			
    		int volte=n/i;
    		for(int j=1; j < volte; j++)
    			if(s.compare(j*i,i,sottostr))
    			{
    				risposta=0;
    				break;
				}
    		if(risposta)
    		    break;
		}
	}	
	fout << sottostr;	
 	return 0;
}