Cod sursa(job #396829)

Utilizator darrenRares Buhai darren Data 15 februarie 2010 22:16:40
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<fstream>
#include<string>
using namespace std;

void fnReadSubsir(void);
void fnDyn(void);
void fnWriteSubsir(void);
int fnMax(int nFirst,int nSecond);
bool fnTest(int nX,int nY);

struct sPin {
	int nMatch;
	int nBool;
};

int nA[502],nB[502];
int nSizeA,nSizeB;
int nDyn[502][502],nMxVal,nFreq;
int nPinLine[502];

int main(void) {
	fnReadSubsir();
	fnDyn();
	fnWriteSubsir();
	return 0;
}

void fnReadSubsir(void) {
	ifstream ifSubsir("subsir.in");
	char chA[502],chB[502];
	int nX;
	
	ifSubsir>>chA>>chB;
	nSizeA=strlen(chA);
	nSizeB=strlen(chB);
	ifSubsir.close();
	
	for (nX=1;nX<=nSizeA;++nX) 
		nA[nX]=chA[nX-1]-'a'+1;
	for (nX=1;nX<=nSizeB;++nX) 
		nB[nX]=chB[nX-1]-'a'+1;
}

void fnDyn(void) {
	int nX,nY,nPut=0;
	for (nX=1;nX<=nSizeA;++nX)
		for (nY=1;nY<=nSizeB;++nY)
			if (nA[nX]==nB[nY]) {
				nDyn[nX][nY]=nDyn[nX-1][nY-1]+1;
				if (nDyn[nX][nY]>nMxVal) {
					nMxVal=nDyn[nX][nY];
					nFreq=1;
				} else if (nDyn[nX][nY]==nMxVal && fnTest(nX,nY) && nX!=1 && !nPinLine[nX])
						++nFreq;
				nPinLine[nX]=1;
			} else
					nDyn[nX][nY]=fnMax(nDyn[nX][nY-1],nDyn[nX-1][nY]);
}

void fnWriteSubsir(void) {
	ofstream ofSubsir("subsir.out");
	ofSubsir<<nFreq;
	ofSubsir.close();
}

int fnMax(int nFirst,int nSecond) {
	if (nFirst>nSecond) return nFirst;
	return nSecond;
}

bool fnTest(int nX,int nY) {
	int nZ;
	bool bOk=false;
	for (nZ=1;nZ<=nY;++nZ)
		if (nDyn[nZ][nY]!=nDyn[nZ-1][nY]) {
			bOk=true;
			break;
		}
	if (bOk) return true;
	return false;
}