浅谈\(Trie\):https://www.cnblogs.com/AKMer/p/10444829.html

题目传送门:http://poj.org/problem?id=2564

记\(f[i]\)表示从第\(i\)个字符串开始可以变换多长。

每次把当前字符串在\(Trie\)树上搜索,设\(dp(ID,u,len,bo)\)表示我把第\(ID\)个字符串在\(Trie\)树上搜索,到了\(u\)这个点,已经处理了\(len\)位,并且是否做过改动。

修改就走除了下一个字符以外的边继续搜,插入就枚举\(26\)条边依次去搜但是不加\(len\),删除就是再次访问当前节点不过让\(len=len+1\)

当\(len\)等于字符串长度的时候和当前点表示的那一号字符串的\(f_{u}+1\)取\(max\)即可。

答案就是\(f\)的最大值加一。

时间复杂度:\(O(n*len^2*26)\)

空间复杂度:\(O(n*len*26)\)

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn=25005; int n=1,ans;
char s[maxn][20];
int f[maxn],Len[maxn]; struct Trie {
int tot;
int id[maxn*16];
int son[maxn*16][26]; void ins(int ID) {
int pos=1,len=strlen(s[ID]+1);
for(int i=1;i<=len;i++) {
if(son[pos][s[ID][i]-'a'])
pos=son[pos][s[ID][i]-'a'];
else pos=son[pos][s[ID][i]-'a']=++tot;
}
id[pos]=ID;
} void dp(int ID,int u,int len,int bo) {
if(len==Len[ID]) {
if(id[u]&&bo)return;
if(id[u])f[ID]=max(f[ID],f[id[u]]+1);
if(bo) {
for(int i=0;i<26;i++)
if(id[son[u][i]])f[ID]=max(f[ID],f[id[son[u][i]]]+1);
}
return;
}
int c=s[ID][len+1]-'a';
if(son[u][c])dp(ID,son[u][c],len+1,bo);
if(bo) {
for(int i=0;i<26;i++) {
dp(ID,son[u][i],len,0);
if(i!=c)dp(ID,son[u][i],len+1,0);
}
dp(ID,u,len+1,0);
}
}
}T; int main() {
T.tot=1;
while(~scanf("%s",s[n]+1))n++;
for(int i=1;i<n;i++) {
Len[i]=strlen(s[i]+1),T.dp(i,1,0,1);
ans=max(ans,f[i]),T.ins(i);
}
printf("%d\n",ans+1);
return 0;
}

POJ2564:Edit Step Ladders的更多相关文章

  1. Edit Step Ladders - UVA 10029

    题意 题目链接(Virtual Judge):Edit Step Ladders - UVA 10029 题意: 如果单词 \(x\) 能通过添加.删除或修改一个字母变换为单词 \(y\),则称单词 ...

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

    Description Problem C: Edit Step Ladders An edit step is a transformation from one word x to another ...

  3. UVa 10029 - Edit Step Ladders

    題目:已知一些字典序排列的單詞,問能從中找到最大的一個有序單詞集合, 使得集合中的單詞每一個是有上一個單詞經過一次變換得來的(增.刪.改). 分析:dp,LIS.最大遞增子序列,不過數據較大须要優化. ...

  4. UVA 10029 Edit Step Ladders ——(DAG求最长路)

    题意:升序的给出一本若干个单词,每个单词都可删除一个字母,添加一个字母或者改变一个字母,如果任意一个操作以后能变成另外一个字典中的单词,那么就连一条有向边,求最长的长度. 分析:DAG的最长路和最短路 ...

  5. uva 10026 Problem C: Edit Step Ladders

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  6. ASP.NET MVC 5 学习教程:Edit方法和Edit视图详解

    原文 ASP.NET MVC 5 学习教程:Edit方法和Edit视图详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 ...

  7. 【译】ASP.NET MVC 5 教程 - 7:Edit方法和Edit视图详解

    原文:[译]ASP.NET MVC 5 教程 - 7:Edit方法和Edit视图详解 在本节中,我们继续研究生成的Edit方法和视图.但在研究之前,我们先将 release date 弄得好看一点.打 ...

  8. CF1245E:Hyakugoku and Ladders

    CF1245E:Hyakugoku and Ladders 题意描述: 给你一个\(10*10\)的矩阵,矩阵描述如下 最开始的时候你在左下角,你的目标是到达左上角. 你可以走路径或者爬梯子. 路径的 ...

  9. kylin Build过程问题排查:17 Step Name: Build Cube In-Mem

    Kylin Build执行到底17步时报错:17 Step Name: Build Cube In-Mem  ,错误截图如下: 点左下角的MRJob图标,打开查看错误信息: 从MRJob中的描述中可见 ...

随机推荐

  1. msdia80.dll文件出现在磁盘根目录下的解决方案(转)

    情况描述: 当安装某些软件后,磁盘根目录中多出了msdia80.dll文件,该文件显示为2006年12月1日,884KB. 原因:   当使用64位操作系统时,在电脑上安装 Microsoft Vis ...

  2. Ansible 小手册系列 十六(Playbook Debug)

    debug模块在执行期间打印语句,并且可用于调试变量或表达式,而不必停止playbook. 打印自定义的信息 - debug: msg="System {{ inventory_hostna ...

  3. 【zzuli-2266】number(二进制处理)

    题目描述 某人刚学习了数位DP,他在某天忽然思考如下问题: 给定n,问有多少数对<x, y>满足: x, y∈[1, n], x < y x, y中出现的[0, 9]的数码种类相同 ...

  4. js的 style.width 取不到元素的宽度值

    以前一直用jquery的.width()方法来获取一个元素的当前的宽度.不管该元素是否设置了宽度,CSS样式是内联.外联or内嵌,都可用此方式获得元素当前的宽度. 今天想用原生JS想获取一个元素宽度时 ...

  5. Ubuntu 14.10安装simplescalar

    经过两天的安装,终于把simplescalar安装成功,安装过程中在网上找了很多资料,但是很多都是关于低版本ubuntu安装的过程,而且按照这些教程也没有安装成功,来记录一下安装中出现的问题及解决方案 ...

  6. Bireme:一个 Greenplum数据仓库的增量同步工具

    https://hashdatainc.github.io/bireme/ Bireme 是一个 Greenplum / HashData 数据仓库的增量同步工具.目前支持 MySQL.Postgre ...

  7. 【PL/SQL编程】条件语句

    1. if...then语句 if <condition_expression> then plsql_sentence; end if; declare -- Local variabl ...

  8. 自定义view:view的绘制流程

    1.view的绘制流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw. ...

  9. nginx在使用proxy_pass的情况下开启error_page

    error_page用于指定特定错误发生时要显示的url,但是如果请求经proxy_pass处理后,如何使error_page对upstream产生的错误进行处理呢? 方法很简单. 保持之前的erro ...

  10. debian 8.1 安装idempiere 2.1 X64 笔记

    接上文.当虚拟服务器和虚拟机搭建完成后.登陆debian 8.1 X64. 进入虚拟服务器控制台.打开虚拟机.root登陆.(留好初始状态系统快照.以便系统恢复.) 由于之前debian8.1X64默 ...