又被水題虐了。。。。。。給你一堆士兵的等級,等級高的的士兵可以當等級小的士兵的師傅,一個士兵最多一個師傅(可以沒有),一個師傅最多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;
}