您的位置:首页 > 其它

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

2015-10-10 18:22 387 查看
//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
)!=EOF)
insert(s
,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 算法 dp