PhpRiot
Recent Code Pastes

Listing 1516

Submitted by asdf, 12 August 2008
#include <stdio.h>
#include <memory.h>
#define MN 1001
int n, m;
char a[MN], b[MN];
void input()
{
	scanf("%s%s", &a[1], &b[1]);
	n = strlen(&a[1]); m = strlen(&b[1]);
}
int w1[MN][MN], w2[MN][MN], c[MN][MN];
int C(int i, int j)
{
	if (i < 0 || j < 0) return -1;
	if (c[i][j] >= 0) return c[i][j];
	int &v = c[i][j], p;
	
	if (C(i,j-1) >= 0) {
		if (v > C(i,j-1)+1 || v < 0)
			v = C(i,j-1)+1;
	}
	if (C(i-1,j) >= 0) {
		if (v > C(i-1,j)+1 || v < 0)
			v = C(i-1,j)+1;
	}
	if (C(i-1,j-1) >= 0) {
		if (v > C(i-1,j-1)+(a[i]!=b[j]) || v < 0)
			v = C(i-1,j-1)+(a[i]!=b[j]);
	}
	if (i-1 >= 0) {
		p = w1[j][i-1];
		if (C(p-1,j-2) >= 0) {
			if (a[i] == b[j-1]) {
				if (v > C(p-1,j-2)+(i-p) || v < 0)
					v = C(p-1,j-2)+(i-p);
			}
		}
	}
	if (j-1 >= 0) {
		p = w2[i][j-1];
		if (C(i-2,p-1) >= 0) {
			if (a[i-1] == b[j]) {
				if (v > C(i-2,p-1)+(j-p) || v < 0)
					v = C(i-2,p-1)+(j-p);
			}
		}
	}
	return v;
}
void process()
{
	int i, j;
	
	for (i = 1; i <= m; i++) {
		for (j = 1; j <= n; j++) {
			if (a[j] == b[i])
				w1[i][j] = j;
			else w1[i][j] = w1[i][j-1];
		} 
	}
	for (i = 1; i <= n; i++) {
		for (j = 1; j <= m; j++) {
			if (a[i] == b[j])
				w2[i][j] = j;
			else
				w2[i][j] = w2[i][j-1];
		}
	}
	memset(c,128,sizeof(c));
	c[0][0] = 0;
	printf("%d\n", C(n,m));
}
int main()
{
	freopen("input.txt", "r", stdin);
	input();
	process();
	return 0;
}
Submit a Follow Up