Cod sursa(job #309643)

Utilizator katakunaCazacu Alexandru katakuna Data 30 aprilie 2009 20:43:12
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
using namespace std;
#include <cstdio>
#include <algorithm>
	
#define Nmax 1000010
	
int T;
int pi[Nmax];
char s1[Nmax], s2[Nmax];
	
int prefix(char s1[], char s2[]){
	
	//cel mai lung prefix a lui s1 care este sufix a lui s2
	int i, n1 = strlen(s1) - 1, n2 = strlen(s2) - 1, p = 0;
	//memset(pi, 0, sizeof(pi));
	
	pi[1] = 0;
	for(i = 2; i <= n2; i++){
		
		while( p && s1[p + 1] != s2[i] ) p = pi[p];
		
		if( s1[p + 1] == s2[i] ) p++;
		pi[i] = p;
		
	}
	
	return n1 + n2 - pi[n2];
}	
	
int main(){
	
	FILE *f = fopen("superstring.in", "r");
	FILE *g = fopen("superstring.out", "w");
	
	for(fscanf(f,"%d\n", &T), s1[0] = s2[0] = '0'; T ; T--){
		fscanf(f,"%s%s", s1 + 1, s2 + 1);
		fprintf(g,"%d\n", min( prefix(s1, s2), prefix(s2, s1) ));
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}