比赛 |
noip_6 |
评测结果 |
AAAAAAAAAA |
题目名称 |
词链 |
最终得分 |
100 |
用户昵称 |
BYVoid |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2008-10-08 20:35:56 |
显示代码纯文本
#include <iostream>
#define MAXN 10001
using namespace std;
class list
{
public:
list *next;
int p;
list(int tp)
{
p=tp;
next=0;
}
};
class tadjl
{
public:
list *first,*last;
void ins(int p)
{
if (first)
last=last->next=new list(p);
else
first=last=new list(p);
}
tadjl()
{
first=last=0;
}
};
char S[MAXN][50];
int N,Ans;
tadjl adjl[MAXN];
int F[MAXN];
inline bool include(char *a,char *b)
{
while (*a==*b)
a++,b++;
return (*a==0 && *b!=0);
}
int getp(int p)
{
for (int b=p-1;b>=1;b--)
if (include(S[b],S[p]))
return b;
return 0;
}
void init()
{
int i,j;
freopen("link.in","r",stdin);
freopen("link.out","w",stdout);
scanf("%d\n",&N);
for (i=1;i<=N;i++)
{
scanf("%s\n",S[i]);
j=getp(i);
if (j)
adjl[i].ins(j);
}
}
int dp(int i)
{
int j,max=0;
list *k;
for (k=adjl[i].first;k;k=k->next)
{
j=k->p;
if (F[j]==0)
F[j]=dp(j);
if (F[j]>max)
max=F[j];
}
return max+1;
}
void solve()
{
int i;
for (i=N;i>=1;i--)
{
if (F[i]==0)
F[i]=dp(i);
if (F[i]>Ans)
Ans=F[i];
}
}
int main()
{
init();
solve();
cout << Ans << endl;
return 0;
}