http://acm.hdu.edu.cn/showproblem.php?pid=1800

C++版本一

贪心

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
    int n,i,max,t;
    int a[3005];
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;++i)
            scanf("%d",&a[i]);
        sort(a,a+n);
        max=1;
        t=1;
        for(i=1;i<n;++i)
        {
            if(a[i]!=a[i-1])
                t=1;
            else 
                ++t;
            if(t>max)
                max=t;
        }
        printf("%d\n",max);
    }
    return 0;
}

C++代码二

字典树

#include<cstdio>
#include<cstring>
#include<stdlib.h>

struct node
{
    int sum;
    node *next[26];    
};
node memory[1000000];
int k;
int max;

void insert(char *t,node *T)
{
    int i,id,j;
    node *p,*q;
    p=T;
    i=0;
    while(t[i])
    {
        id=t[i]-'0';
        if(p->next[id]==NULL)
        {
        //    q=(node *)malloc(sizeof(node));
            q=&memory[k++];
            q->sum=0;
            for(j=0;j<26;++j)
                q->next[j]=NULL;
            p->next[id]=q;
        }
        p=p->next[id];
        ++i;
    }
    p->sum++;
    if(max<p->sum)
        max=p->sum;
}

int main()
{
    int n,i;
    char s[35];
    node *T;
//    T=(node *)malloc(sizeof(node));
    T=&memory[0];
    while(scanf("%d",&n)!=EOF)
    {
        max=0;
        k=1;
        T->sum=0;
        for(i=0;i<26;++i)
            T->next[i]=NULL;
        while(n--)
        {
            scanf("%s",s);
            i=0;
            while(s[i++]=='0');
            insert(&s[i-1],T);
        }
        printf("%d\n",max);
    }
    return 0;
}

C++版本三

字典树

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct Tree
{
    int num;
    Tree *next[10];
    Tree()
    {
        num=0;
        for(int i=0;i<10;i++)
        {
            next[i]=NULL;
        }
    }
}*root;
int insert(Tree *p,char *s)
{
    int i=0;
    while(s[i])
    {
        int x=s[i]-'0';
        if(p->next[x]==NULL)
        {
            p->next[x]=new Tree();
        }
        p=p->next[x];
        i++;
    }
    p->num++;
   // cout<<"数为:"<<p->num<<endl;
    return (p->num);
}
int main()
{
    char s[30],s1[30];
    int n,maxs,stl,i,len;
    while(cin>>n)
    {
        root=new Tree();
        maxs=-5;
        while(n--)
        {
            cin>>s;
            stl=strlen(s);
            i=len=0;
            for(i=0;i<stl;i++)
            {
                if(s[i]!='0')
                {
                    break;
                }
            }
            for(i;i<stl;i++)
            {
                s1[len++]=s[i];
            }
            s1[len]='\0';
          //  cout<<s1<<endl;
            maxs=max(maxs,insert(root,s1));
        }
        cout<<maxs<<endl;
    }
}

C++版本四

二分查找树/二叉排序树


#include <stdio.h>
#include <malloc.h>
struct node 
{
    int num;
    node *lc;
    node *rc;
    int time;
};
int max;
struct node *BST(struct node *root,int num)
{
    if (root==NULL)       //根节点为空 建立根节点
    {
        root=(struct node *)malloc(sizeof(struct node));
        root->lc=NULL;
        root->rc=NULL;
        root->num=num;
        root->time=1;
    }
    else 
    {
        if (root->num==num)        // 根的name 和 s相同,次数+1
        {
             root->time++;
             if (root->time>max) 
                 max=root->time;
        }
        else if (root->num>num)    // 根比s大,找左子树
            root->lc=BST(root->lc,num);
        else                      // 根比s小,找右子树
            root->rc=BST(root->rc,num);
    }
    return root;
} 
int main()
{
    int n,i,num;
    while (scanf("%d",&n)!=EOF)
    {
         struct node *root=NULL;
         max=1;
         for (i=0;i<n;i++)
         {
            scanf("%d",&num);
            root=BST(root,num);
         }
         printf ("%d\n",max);
    }
    return 0;
}

C++版本五

题解:map

每个串去掉一串最长的 再去掉一串次长的。。。。。

到最后肯定剩下某个出现次数最多的数字  所以本题就是找那个数字出现的最多 最多的次数是多少

#include<stdio.h>
#include<map>
using namespace std;
int main()
{
	__int64 i,n,max;
	map<__int64,__int64>mp;
	while(scanf("%I64d",&n)!=EOF)
	{
		mp.clear();
		while(n--)
		{
			scanf("%I64d",&i);
			mp[i]++;
		}
		map<__int64,__int64>::iterator it;
		max=0;
		for(it=mp.begin();it!=mp.end();it++)
			if(max<it->second) max=it->second;
		printf("%I64d\n",max);
	}
	return 0;
}

C++版本六

字典树

TLEing

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=700000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,q;
int ans,cnt,flag,temp;
int a[N][10];
char str[50];
int sum[N];
void init(){
    memset(a,0,sizeof(a));
    memset(sum,0,sizeof(sum));
    cnt=0;
    ans=0;
}
int insert(char *num){
    int len=strlen(num),p=0;
    for(int i=0;i<len;i++){
        int tmp=num[i]-'0';
        if(a[p][tmp]==0)a[p][tmp]=++cnt;
        p=a[p][tmp];
    }
    sum[p]++;
    return sum[p];
}
int main()
{
#ifdef DEBUG
	freopen("input.in", "r", stdin);
	//freopen("output.out", "w", stdout);
#endif
    //scanf("%d",&n);
    //scanf("%d",&t);
    ios::sync_with_stdio(0);
    while(~scanf("%d",&n)){
        init();
        for(int i=1;i<=n;i++){
            scanf("%s",str);
            int pos=0;
            while(str[pos++]=='0');
            ans=max(ans,insert(&str[pos-1]));
        }
        cout<<ans<<endl;
    }
    //cout << "Hello world!" << endl;
    return 0;
}