题目的意思就是从给出的按字典序排序的那 一串 字符串中,找到最到最长的一个子串.
这个串满足,每一个都能由上一个一步变过来.(指改变一个字符 ,或者删除一个 , 或者添加一个) .
如样例中的
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);
}