uva10029(DP)

题目的意思就是从给出的按字典序排序的那 一串 字符串中,找到最到最长的一个子串.

这个串满足,每一个都能由上一个一步变过来.(指改变一个字符 ,或者删除一个 , 或者添加一个) .

如样例中的

dig

fig

fin

fine

wine

首先我一开始用的是一个judge函数,把它和前面的所有去匹配,在匹配上的里面,找到最大值...超时没得商量...

然后改了方法.我把和这个字符串值差一步的所有字符串,构造出来.然后二分去匹配,看看前面有有没这个,找到匹配上的最大值.


AC代码:


#include<stdio.h>
#include<math.h>
#include<string.h>
const int N = 25005;
char str[N][20];
char str2[N][20];
int f[N];
int binary(char* a , int l , int r) {
	if(l > r)
		return -1;
	int mid = (l + r) / 2 ;
	if(strcmp(a , str[mid]) == 0)
		return mid;
	if(strcmp(a,str[mid]) > 0) {
		return binary(a ,mid + 1 , r);
	}
	else {	
		return binary(a ,l , mid - 1);
	}
}
void change(char* a ,int s , char c , int pos) {
	if(s == 0) {
		a[pos] = c;
		return ;
	}
	int len = strlen(a);
	if(s == 1) {
		for (int i = len + 1 ; i >=pos ; i--) {
			a[i] = a[i - 1];
		}
		a[pos] = c;
	}
	if(s == 2) {
		for (int i = pos ; i < len ;i++) {
			a[i] = a[i + 1];
		}
	}

}
int main () {
	int n = 0;
	int res = 1;
	memset(f , 1 ,sizeof(f));
	while(scanf("%s",str[n]) != EOF) {
		strcpy(str2[n] , str[n]);
		int m = 1 ;
		int len = strlen(str[n]);
		for (int k = 0 ; k <= 2 ;k++) {
			for (int i = 0 ; i < len ;i++) {
				if(k == 2) {
					change(str2[n] , k , 'a' , i);
					int flag = binary(str2[n] , 0 , n - 1);
					if(flag != -1 && f[flag] + 1 > m)
						m = f[flag] + 1;
					strcpy(str2[n] , str[n]);
					continue;		
				}
				for (char c = 'a' ; c <= 'z' ;c++) {
					change(str2[n] , k , c , i);
					int flag = binary(str2[n] , 0 , n - 1);
					if(flag != -1 && f[flag] + 1 > m)
						m = f[flag] + 1;
					strcpy(str2[n] , str[n]);
				}
			}
		}
		f[n] = m;
		if(m > res)
			res = m;
		n++;
	}
	printf("%d\n",res);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值