2013金山西山居创意游戏程序挑战赛——初赛(3)

第一题: HDU  4551  生日猜猜猜

直接暴力求解,枚举每个月每一天。

只是开始的时候没有注意到可能有多种符合,我是直接break的,WA了。

#include <iostream>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <map>
using namespace std;

const int N=1510;
typedef long long LL;

bool run(int y)
{
    return (y%4==0&&y%100!=0)||y%400==0;
}

int gcd(int m,int n)//最大公约数
{
    int t;
    while(n)
    {    t=m%n;    m=n;    n=t;    }
    return m;
}

int main()
{
    int n,T,m,x,z,y,d,aa,bb;
    int i,j;
    int ti=0;
    cin>>T;
    while(T--)
    {
        int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        cin>>x>>y>>z;
        if(run(z))
            a[2]++;
        int flag=0;
        for(i=1;i<=12;i++)
            for(j=1;j<=a[i];j++)
            {
                int q=gcd(i,j);
                int p=i*j/q;
                if(q==x&&p==y)
                {
                    flag++;
                    aa=i;
                    bb=j;
                }
            }
        if(flag==0)
            printf("Case #%d: -1\n",++ti);
        else if(flag>1)
            printf("Case #%d: 1\n",++ti);
        else
            printf("Case #%d: %d/%02d/%02d\n",++ti,z,aa,bb);
    }
    return 0;
}


第二题:  HDU  4552   怪盗基德的挑战书

kmp算法,用后缀数组也行。

#include <iostream>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <map>
using namespace std;

const int N=100005;
typedef __int64 LL;

char str[N];
int c[N];
int next[N];
int ans;
int n;

void getNext(char *p,int *next)
{
    int j,k;
    next[0]=-1;
    j=0;
    k=-1;
    while(j<n)
    {
        if(k==-1||p[j]==p[k])
        {
            if(k!=-1)
            {
                c[j]=c[k]+1;
                ans+=c[j];
            }
            j++;
            k++;
            next[j]=k;
        }
        else
            k=next[k];
    }
}

int main ()
{
    while(scanf("%s",str)!=EOF)
    {
        ans=0;
        n=strlen(str);
        memset(c,0,sizeof(c));
        getNext(str,next);
        ans=(ans+n)%256;
        printf("%d\n",ans);
    }
}



第三题:

待续。。。。

你可能感兴趣的:(2013金山西山居创意游戏程序挑战赛——初赛(3))