| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
结束了,帮我看一下行吗?我的99长的CASE也没有超时啊...(这是改了n次后的结果)#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define size 100
int len1,len2;
char str1[size];
char str2[size];
int len[size][size];
char cur[size+size];
char ans[10000][size+size];
int top,maxlen,tops;
struct node{
int i,j;
int len;
};
node s[size*size];
node path[size+size];
int start[size+size];
int print()
{
int i,j;
for(i=0;i<=len2;i++)
{
for(j=0;j<=len1;j++) printf("%3d",len[i][j]);
printf("\n");
}
return 12;
}
void add(int l)
{
int i;
if(l!=maxlen) return;
for(i=0;i<top;i++)
if(strcmp(cur,ans[i])==0) return ;
strcpy(ans[top++],cur);
}
int cmp(const void*a,const void*b)
{ return strcmp((char*)a,(char*)b); }
void backtrack(int i,int j,int l)
{
if(i>len2 || j>len1)
{ cur[l] = 0; add(l); return ; }
if(str2[i]==str1[j])
{
cur[l] = str2[i];
backtrack(i+1,j+1,l+1);
}
else
{
backtrack(i+1,j,l);
backtrack(i,j+1,l);
}
}
void save()
{
int i,j;
for(i=1;i<=len2;i++)
for(j=1;j<=len1;j++)
{
if((len[i][j]==len[i-1][j-1]+1) && (str2[i]==str1[j]))
{
s[tops].i = i; s[tops].j = j; s[tops++].len = len[i][j];
}
}
}
int cmp2(const void*a,const void*b)
{ return (*(node*)a).len-(*(node*)b).len; }
void add2()
{
int i;
for(i=1;i<=maxlen;i++)
cur[i-1] = str2[path[i].i];
cur[maxlen] = 0;
// for(i=0;i<top;i++) if(strcmp(cur,ans[i])==0) return ;
strcpy(ans[top++],cur);
}
void dfs(int len)//len,³¤¶È
{
int i;
if(len>maxlen)
{ cur[len] = 0; add2(); return ;}
for(i=start[len];s[i].len==len;i++)
{
if(s[i].i>path[len-1].i && s[i].j>path[len-1].j)
{ path[len] = s[i]; dfs(len+1); }
}
}
void find()
{
int i,j;
tops = 0;
save();
qsort(s,tops,sizeof(s[0]),cmp2);
for(start[0]=0,i=1;i<=maxlen;i++)
{
for(j=start[i-1]+1;s[j].len!=i;j++);
start[i] = j;
}
path[0].i = 0;
path[0].j = 0;
dfs(1);
}
void solve()
{
int i,j;
len1 = strlen(str1+1);
len2 = strlen(str2+1);
for(i=1;i<=len2;i++)
for(j=1;j<=len1;j++)
{
if(str2[i]==str1[j]) len[i][j] = len[i-1][j-1]+1;
else len[i][j] = (len[i][j-1]>len[i-1][j])?len[i][j-1]:len[i-1][j];
}
maxlen = len[len2][len1];
// print();
top = 0;
find();
// backtrack(1,1,0);
qsort(ans,top,sizeof(ans[0]),cmp);
printf("%s\n",ans[0]);
for(i=1;i<top;i++)
{
if(strcmp(ans[i-1],ans[i])==0) continue;
printf("%s\n",ans[i]);
}
}
int main()
{
// if(!freopen("1934.in","r",stdin)) return 12;
// if(!freopen("19342.out","w",stdout)) return 12;
// while(scanf("%s%s",str1+1,str2+1)!=EOF)
scanf("%s%s",str1+1,str2+1);
solve();
return 123;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator