UVA - 10029 Edit Step Ladders (二分+hash)

来源:互联网 发布:北风网php 百度云 编辑:程序博客网 时间:2024/04/30 09:32

Description

Download as PDF

Problem C: Edit Step Ladders


An edit step is a transformation from one word x to another wordy 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 fromdig to dog or from dog to do are both edit steps. Anedit step ladder is a lexicographically ordered sequence of words w1, w2, ... wn such that the transformation fromwi to wi+1 is an edit step for all i from 1 ton-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. 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

catdigdogfigfinfinefoglogwine

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;}


0 0
原创粉丝点击