hdu1800 flying to the mass

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章