poj 2564 Edit Step Ladders TRIE树+dp求图中最长路

来源:互联网 发布:无线破解密码软件 编辑:程序博客网 时间:2024/06/03 19:33
//poj 2564//sep9#include <iostream>using namespace std;const int MAXN=25000;int n,idx;char tmp[20],s[MAXN+10][20];int dp[MAXN+10];struct TRIE{int c[27];bool vis;int ids;}a[8*MAXN+10];void insert(char ss[],int u){int i=0,h=0;while(ss[i]!='\0'){int t=ss[i]-'a';if(a[h].c[t]==0)a[h].c[t]=++idx;h=a[h].c[t];++i;}a[h].vis=true;a[h].ids=u;}int find(char ss[]){int i=0,h=0;while(ss[i]!='\0'){int t=ss[i]-'a';if(a[h].c[t]==0)return -1;h=a[h].c[t];++i;}if(a[h].vis==true) return a[h].ids;return -1;}void add(char ss[],int i,int d){int p=0,q=0;while(p<i)tmp[q++]=ss[p++];tmp[q++]=d+'a';while(ss[p])tmp[q++]=ss[p++];tmp[q]='\0';}void del(char ss[],int i){int p=0,q=0;while(p<i)tmp[q++]=ss[p++];++p;while(ss[p])tmp[q++]=ss[p++];tmp[q]='\0';}void trans(char ss[],int i,int d){strcpy(tmp,ss);tmp[i]=d+'a';}int rec(int u){if(dp[u]!=-1)return dp[u];int ans=0,len=strlen(s[u]);for(int i=0;i<=len;++i)for(int d=0;d<26;++d){add(s[u],i,d);int v;v=find(tmp);if(v!=-1&&strcmp(s[u],tmp)<0)ans=max(ans,rec(v)+1);}for(int i=0;i<len;++i){del(s[u],i);int v=find(tmp);if(v!=-1&&strcmp(s[u],tmp)<0)ans=max(ans,rec(v)+1);}for(int i=0;i<len;++i)for(int d=0;d<26;++d){trans(s[u],i,d);int v=find(tmp);if(v!=-1&&strcmp(s[u],tmp)<0)ans=max(ans,rec(v)+1);}return dp[u]=ans;}int main(){memset(a,0,sizeof(a));idx=0;n=0;while(scanf("%s",s[n])!=EOF)insert(s[n],n),++n;memset(dp,-1,sizeof(dp));int ans=0;for(int i=0;i<n;++i)ans=max(ans,rec(i));printf("%d",ans+1);return 0;}


0 0
原创粉丝点击