比赛 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;
}