POJ2564:Edit Step Ladders

浅谈\(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;
}

转载于:https://www.cnblogs.com/AKMer/p/10446925.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值