zoj 1876 Edit Step Ladders

发布于 2020-02-12 00:09:58

An edit step is a transformation from one word x to another word y such that x and y are words in the dictionary, and x can be transformed to y by adding, deleting, or changing one letter. So the transformation from dig to dog or from dog to do are both edit steps. An edit step ladder is a lexicographically ordered sequence of words w1, w2, ... wn such that the transformation from wi to wi+1 is an edit step for all i from 1 to n-1.

For a given dictionary, you are to compute the length of the longest edit step ladder.


Input

The input to your program consists of the dictionary - a set of lower case words in lexicographic order - one per line (the character "-" or "'" may also appear). No word exceeds 16 letters and there are no more than 25000 words in the dictionary.


Output

The output consists of a single integer, the number of words in the longest edit step ladder.


Sample Input

cat
dig
dog
fig
fin
fine
fog
log
wine


Sample Output

5

关注者
0
被浏览
116
1 个回答
  • 面试哥
    面试哥 2020-02-12
    为面试而生,有面试问题,就找面试哥。
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int MAXN = 25010;
    const int HASH = 1000010;
    
    int n,head[HASH],next[MAXN],f[MAXN];
    char b[MAXN][20],temp[20];
    
    int hash(char *s){
    	int v = 0,seed = 131;
    	while (*s)
    		v = v * seed + *(s++);
    	return (v & 0x7fffffff) % HASH;
    }
    
    void insert(int s){
    	int h = hash(b[s]);
    	next[s] = head[h];
    	head[h] = s; 
    }
    
    int search(char *s){
    	int i,h = hash(s);
    	for (i = head[h]; i != -1; i = next[i])
    		if (!strcmp(b[i],s))
    			break;
    	return i;
    }
    
    void add(char *s, int p, int d){
    	int i = 0, j = 0;
    	while (i < p)
    		temp[j++] = s[i++];
    	temp[j++] = 'a' + d;
    	while (s[i])
    		temp[j++] = s[i++];
    	temp[j] = '\0';
    }
    
    void del(char *s, int p){
    	int i = 0,j = 0;
    	while (i < p)
    		temp[j++] = s[i++];
    	i++;
    	while (s[i])
    		temp[j++] = s[i++];
    	temp[j] = '\0';
    }
    
    void change(char *s, int p, int d){
    	strcpy(temp, s);
    	temp[p] = 'a' + d;
    }
    
    int dp(int s){
    	if (f[s] != -1)
    		return f[s];
    	int ans = 0;
    	int len = strlen(b[s]);
    	for (int p = 0; p <= len; p++)
    		for (int d = 0; d < 26; d++){
    			add(b[s], p, d);
    			int v = search(temp);
    			if (v != -1 && strcmp(b[s], temp) < 0){
    				int t = dp(v);
    				if (ans < t+1)
    					ans = t+1;
    			}
    		}
    	for (int p = 0; p < len; p++){
    		del(b[s], p);
    		int v = search(temp);
    		if (v != -1 && strcmp(b[s], temp) < 0){
    			int t = dp(v);
    			if (ans < t+1)
    				ans = t+1;
    		}
    	}
    	for (int p = 0; p < len; p++)
    		for (int d = 0; d < 26; d++){
    			change(b[s], p, d);
    			int v = search(temp);
    			if (v != -1 && strcmp(b[s], temp) < 0){
    				int t = dp(v);
    				if (ans < t+1)
    					ans = t+1;
    			}
    		}
    	return f[s] = ans;
    }
    
    int main(){
    	n = 0;
    	memset(head, -1, sizeof(head));
    	while (scanf("%s", b[n]) != EOF){
    		insert(n),++n;
    	}
    	memset(f, -1, sizeof(f));
    	int ans = 0;
    	for (int i = 0; i < n; i++){
    		int t = dp(i);
    		if (ans < t)
    			ans = t;
    	}
    	printf("%d\n", ans+1);
    	return 0;
    }
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看