Cod sursa(job #206676)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 8 septembrie 2008 18:27:28
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#include<string.h>
# define NM 10000007
# define MM 21
# define N 1000007
int n=1,len,kroot,ok,a,i,j,k,l;
int v[N][3];
int ab1[N][3];
int ab2[N];
int ab3[N];
unsigned char s[N];
char sM[NM];
char sm[MM];
void crissis(char *sm){
	kroot=0;
	for(char *c=sm;*c;++c){
		i=*c-'a';
		if(v[kroot][i])
			kroot=v[kroot][i];
		else{
			v[kroot][i]=++n;
			kroot=n;
		}
	}
	s[n]=1;
}
void solve(char *sm){
	kroot=1;
	for(char *c=sm;*c;++c){
		i=*c-'a';
		kroot=ab1[kroot][i];
		a+=s[kroot];
	}
}
void funct(){
	int sf=0,u;
	for(i=0;i<3;++i){
		ab1[1][i]=1;
		if(v[1][i]!=1){
			ab2[sf++]=v[1][i];
			ab3[v[1][i]]=1;
			ab1[1][i]=v[1][i];
		}
	}
	for(i=0;i<sf;++i){
		for(j=0;j<3;++j)
			if(v[ab2[i]][j]){
				ab2[sf++]=v[ab2[i]][j];
				u=ab3[ab2[i]];
				while(!v[u][j])
					u=ab3[u];
				ab3[v[ab2[i]][j]]=v[u][j];
				if(s[ab3[v[ab2[i]][j]]]==1)
					s[v[ab2[i]][j]]=1;
			}
		for(l=0;l<3;++l){
			if(v[ab2[i]][l]!=0)
				ab1[ab2[i]][l]=v[ab2[i]][l];
			else
				ab1[ab2[i]][l]=ab1[ab3[ab2[i]]][l];
			if(!ab1[ab2[i]][l])
				ab1[ab2[i]][l]=1;
		}
	}
}
int main(){
	freopen("abc2.in","r",stdin);
	freopen("abc2.out","w",stdout);
	scanf(" %s ",sM);
	for(l=0;scanf(" %s ",sm)!= EOF;)
		crissis(sm);
	for(i=0;i<3;++i)
		if(!v[1][i])
			v[1][i]=1;
	funct();
	solve(sM);
	printf("%d",a);
	fclose(stdin);
	fclose(stdout);
	return 0;
}