又被水题虐了。。。。。。给你一堆士兵的等级,等级高的的士兵可以当等级小的士兵的师傅,一个士兵最多一个师傅(可以没有),一个师傅最多1个徒弟(可以没有),如果是师徒关系,可以用一把扫帚练习技能,问你如果全部士兵都用过扫帚练习时最小需要的扫帚数量。刚开始打算直接贪心的。。复杂度太高,tle了,,然后百度才发现所求的竟然就是出现最多的那一个数,即最长平台.用map做其实爆简单。。。
code:
#include <map>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAXN = 50000;
int n,ans,num;
//字典树数字版
struct tire
{
int cnt;
tire *next[10];
tire()
{
cnt=0;
memset(next,NULL,sizeof(next));
}
}tires[MAXN];
int solve(char *str)
{
int i;
int len=strlen(str);
for(i=0;i<len;i++)
{
if(str[i]!='0')
{
break;
}
}
return i;
}
void insert(int start,char *str)
{
tire *p=&tires[0];
int i,tmp;
int len=strlen(str);
for(i=start;i<len;i++)
{
tmp=str[i]-'0';
if(p->next[tmp]==NULL)
{
p->next[tmp]=&tires[++num];
}
p=p->next[tmp];
}
p->cnt++;
//printf("cnt---%d\n",p->cnt);
if((p->cnt)>ans)
{
ans=p->cnt;
}
}
char str[33];
int main()
{
int i,start;
while(~scanf("%d",&n))
{
ans=1;
num=0;
memset(tires,NULL,sizeof(tires));
for(i=1;i<=n;i++)
{
scanf("%s",str);
start=solve(str);
insert(start,str);
}
printf("%d\n",ans);
}
return 0;
}