词链
TimeLimit:1000MS MemoryLimit:128MB
64-bit integer IO format:
%lld
Problem Description
给定一个英文单词表
如果单词A是单词B的前缀,则单词AB构成了一个词链。例如下面的单词组成了一个词链:
i
int
integer
而下面的单词不组成词链:
integer
intern
请在给定的单词表中取出一些词,组成单词最多的词链。
数据保证给定的单词表中,单词互不相同,并且单词按字典顺序排列。
Input
单组数据
第一行一个整数n(n<=10000),表示单词表中单词数。
下接n行,每行一个单,每个单词仅包含小写字母,其中每个单词最多包含50个字母。
Output
一个整数,表示最长词链长度。
SampleInput
5 i int integer intern internet
SampleOutput
4
思路:和最长上升子序列中使用 lower_bound() 进行dp方法类似
#include<cstring>
#include<stdio.h>
#include<algorithm>
using namespace std;
char a[100010][55];
char st[55];
int main()
{
int n,i,j;
scanf("%d",&n);
int ans=0,top=0,flag; //使用top充当lower_bound()
for ( i=1;i<=n;++i)
{
scanf("%s",st);
while (top)
{
flag=0;
for (j=0;a[top][j];++j)
{
if (a[top][j]!=st[j])
{
flag=1;
break;
}
}
if (!flag)
break;
--top;
}
++top;
strcpy(a[top],st); //进行插入,或者增加
ans=max(ans,top);
}
printf("%d\n",ans);
return 0;
}