# Come velocizzare crossover in c?

**URL:** <https://forum.olinfo.it/t/come-velocizzare-crossover-in-c/4295>\
**Category:** Aiuto\
**Created:** [10 Gennaio 2017, 6:41pm UTC](https://forum.olinfo.it/t/come-velocizzare-crossover-in-c/4295 "2017-01-10T18:41:30Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![andre99](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/a/ce73a5/32.png) [@andre99](https://forum.olinfo.it/u/andre99)\
**Post date:** [10 Gennaio 2017, 6:41pm UTC](https://forum.olinfo.it/t/come-velocizzare-crossover-in-c/4295/1 "2017-01-10T18:41:30Z")

</div>

Ho risolto crossover ma mi fa tutti i casi del subtask 1 e 4 nel tempo limite negli altri sfora ma li fa giusti, potreste darmi qualche consiglio?

```auto
#include <stdio.h>
#include <assert.h>
#include <string.h>
#define MAXL 100008

void scala(char* str)
{
	int cont;
	for(cont=1;cont<=strlen(str);cont++)
	{
		str[cont-1]=str[cont];
	}
}

void crossover(char s[], char t[], char result[])
{
	int cont=0, contf=0, i, esci=0;
	char vapp[MAXL], fine[MAXL];
	
	while((s[0]!='\0' || t[0]!='\0') && esci==0)
	{
		if(s[0]=='\0')
		{
			for(i=0;i<strlen(t);i++)
			{
				result[cont]=t[i];
				cont++;
			}
			esci=1;
		}
		else if(t[0]=='\0')
		{
			for(i=0;i<strlen(s);i++)
			{
				result[cont]=s[i];
				cont++;
			}
			esci=1;
		}
		else if(s[0]==t[strlen(t)-1])
		{
			t[strlen(t)-1]='\0';
			scala(s);
			strcpy(vapp,s);
			strcpy(s,t);
			strcpy(t,vapp);
		}
		else
		{
			result[cont]=t[strlen(t)-1];
			fine[contf]=s[0];
			scala(s);
			contf++;
			cont++;
			t[strlen(t)-1]='\0';
		}
	}
	for(contf=contf-1;contf>=0;contf--)
	{
		result[cont]=fine[contf];
		cont++;
	}
	result[cont]='\0';
}

char s[MAXL];
char t[MAXL];
char r[2*MAXL];

int main() {
    FILE *fr, *fw;

    fr = fopen("input.txt", "r");
    fw = fopen("output.txt", "w");
    assert(2 == fscanf(fr, "%s %s", s, t));

    crossover(s, t, r);
    fprintf(fw, "%s\n", r);
    fclose(fr);
    fclose(fw);
    return 0;
}

```

---

<div class="post-metadata">

**Author:** ![dp\_1](https://forum.olinfo.it/user_avatar/forum.olinfo.it/dp_1/32/2635_2.png) [@dp\_1](https://forum.olinfo.it/u/dp_1)\
**Post date:** [10 Gennaio 2017, 8:36pm UTC](https://forum.olinfo.it/t/come-velocizzare-crossover-in-c/4295/2 "2017-01-10T20:36:55Z")

</div>

Invece di lavorare su array di caratteri con strcpy & co, prova a riscrivere l’algoritmo lavorando con gli indici o, forse ancora più facile da scrivere, con i puntatori all’inizio e alla fine delle due stringhe su cui stai lavorando in un determinato momento.

Guarda anche qui

> [@Come posso velocizzare crossover?](https://forum.olinfo.it/t/come-posso-velocizzare-crossover/4249):
>
> Ho scritto il codice e ho preso 60/100. Per poco avrei preso 100/100, se non fosse stato per quei 0.100 secondi di velocità in più in 3 testcase di 3 subtask diverse. Il codice: #include \<iostream\> #include \<fstream\> #include \<algorithm\> #include \<string.h\> using namespace std; string prima, seconda; string a, b; int n\_prima, n\_seconda; int main() { ifstream in("input.txt"); ofstream out("output.txt"); in \>\> prima \>\> seconda; n\_prima = prima.size() - 1; n\_seconda = seconda.size() -…

Dario
