• 组队赛第二场:字符串哈希+DP


    长春现场赛
    HDU 4821 

    思路:这题周赛的时候没做出来,有点可惜了。要是当时记起来unsigned long long自己主动取模,然后提醒一下大帝的话,后续大帝就能过了。

    唉,导致让他取了好多个模,最后还是WA了。太不机智了。

    范逗了。

    这题我是从前面哈希的。看到题解中从后面哈希。就是不爽,所以自己从前面哈希。

    事实上都一样啦。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<set>
    #include<bitset>
    #define INF 100007
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    char s[100005];
    ull base[100010],hash[100010];
    int main()
    {
        int m,l,i,j;//system("pause");
        for(i=1,base[0]=1;i<100001;i++)
            base[i]=base[i-1]*131ULL;
        while(~scanf("%d%d",&m,&l))
        {
            map<ull,int>mm;
            scanf("%s",s);
            int sum=0,len=strlen(s);
            for(i=1,hash[0]=0;i<=len;i++)
                hash[i]=hash[i-1]*131+s[i-1]-'a'+1;
            for(i=0;i<l&&i+m*l<=len;i++)
            {
                mm.clear();
                for(j=i;j<m*l+i;j+=l)
                    mm[hash[j+l]-hash[j]*base[l]]++;
                if(mm.size()==m) sum++;
                for(j=m*l+i;j<=len-l;j+=l)
                {
                    int head=j-m*l;
                    mm[hash[head+l]-hash[head]*base[l]]--;
                    if(mm[hash[head+l]-hash[head]*base[l]]==0)
                        mm.erase(hash[head+l]-hash[head]*base[l]);
                    mm[hash[j+l]-hash[j]*base[l]]++;
                    if(mm.size()==m) sum++;
                }
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    

    HDU 4815

    这题逗逼了。刚開始大帝告诉我题意可能我理解错了。然后就用二进制枚举了。然后然后……然后就浪费了一个多小时一直WA,后面大帝发觉我理解错了之后。他又敲了背包才过……唉……发现题意真的是有点难理解了。到如今题意和解法还都是半知半懂的。

    正确的解法是:总的情况是:1<<n,然后可组合的次数除以总的情况>=p的最小分数是正确答案。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    long long dp[40005];
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n,i,j,sum=0,a[45];
            double p;
            memset(dp,0,sizeof(dp));
            dp[0]=1;
            cin>>n>>p;
            for(i=0;i<n;i++)
                scanf("%d",a+i),sum+=a[i];
            sort(a,a+n);
            for(i=0;i<n;i++)
                for(j=sum;j>=a[i];j--)
                    dp[j]+=dp[j-a[i]];
            long long sum1=1LL<<n,sum2=0;
            for(i=0;i<=sum;i++)
            {
                sum2+=dp[i];
                if((double)sum2/(double)sum1>=p)
                {
                    printf("%d
    ",i);
                    break;
                }
            }
        }
        return 0;
    }
    


  • 相关阅读:
    Android sensor 系统框架 (一)
    enc28j60网卡驱动模块添加进linux内核,Kconfig,Makefile配置过程
    Linux samba服务器配置
    为群晖加把锁:使用ssh密钥保障数据安全
    浦发银行网上银行U盾证书无法更新的解决办法
    克隆Linux系统的网卡设置
    Linux路由:CentOS6的多种玩法
    专心学LINUX:CentOS关闭屏幕自动锁定和睡眠
    群晖:关闭软路由利用双网卡桥接直连电脑上网
    Ceph之二----部署Ceph集群
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5080880.html
Copyright © 2020-2023  润新知