UVA - 10029 Edit Step Ladders (二分+hash)
阿新 • • 發佈:2017-06-24
see article 字符 not lower hid 思路 cas order
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.
The output consists of a single integer, the number of words in the longest edit step ladder.
Description
Problem C: Edit Step Ladders
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
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. No word exceeds 16 letters and there are no more than 25000 words in the dictionary.Output
Sample Input
cat dig dog fig fin fine fog log wine
Sample Output
5 題意:給你一個遞增的字符串數組,給你三種操作方法變成其它的串,問你最長的可能 思路:hash+二分,dp[i]表示從i開始的串的最長變化可能。記憶化搜索#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 = 1; 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); return 0; }
UVA - 10029 Edit Step Ladders (二分+hash)