zoukankan      html  css  js  c++  java
  • 百度之星2016资格赛之部分题解

    Problem A

     
     Accepts: 1829
     
     Submissions: 12436
     Time Limit: 2000/1000 MS (Java/Others)
     
     Memory Limit: 65536/65536 K (Java/Others)
    Problem Description

    度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串。现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值。一个字符串的哈希值,由以下公式计算得到:

    H(s)=i=1ilen(s)​​(Si​​28) (mod 9973)

    S_{i}Si​​代表 S[i] 字符的 ASCII 码。

    请帮助度熊计算大字符串中任意一段的哈希值是多少

    第一题....线段树 或者  前缀积+逆元...

    代码:

     1 #include <vector>
     2 #include <map>
     3 #include <set>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <cstdio>
     7 #include <cmath>
     8 #include <cstdlib>
     9 #include <string>
    10 #include <cstring>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 
    15 #define MOD 9973
    16 typedef long long LL;
    17 char str[100010];
    18 int f[100010];
    19 
    20 LL qpow(LL x,LL k)
    21 {
    22     LL res = 1;
    23     while(k){
    24         if(k & 1)
    25             res=res*x%MOD;
    26         x=x*x%MOD;
    27         k>>=1;
    28     }
    29     return res;
    30 }
    31 LL inv(LL a,LL x)
    32 {
    33     return qpow(a,x-2);
    34 }
    35 
    36 int main()
    37 {
    38     int a,b,n;
    39     while(~scanf("%d",&n)){
    40         scanf("%s",str);
    41         int len=strlen(str);
    42         for(int i=0;i<len;i++)
    43             f[i+1]=(int)str[i]-28;
    44         for(int i=2;i<=len;i++)
    45             f[i]=(f[i-1]*f[i])%MOD;
    46         
    47         f[0]=1;
    48         
    49         for(int i=0; i<n; i++){
    50             scanf("%d %d",&a,&b);
    51             int ans=(f[b]*inv(f[a-1],MOD))%MOD;
    52             printf("%d
    ",ans);
    53         }
    54     }
    55     return 0;
    56 }

    Problem B

     
     Accepts: 2515
     
     Submissions: 9216
     Time Limit: 2000/1000 MS (Java/Others)
     
     Memory Limit: 65536/65536 K (Java/Others)
    Problem Description

    度熊面前有一个全是由1构成的字符串,被称为全1序列。你可以合并任意相邻的两个1,从而形成一个新的序列。对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列。

    Input

    这里包括多组测试数据,每组测试数据包含一个正整数NN,代表全1序列的长度。

    1N200

    Fib大数处理...

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 string sum(string s1,string s2)
     7 {
     8     if(s1.length()<s2.length())
     9     {
    10         string temp=s1;
    11         s1=s2;
    12         s2=temp;
    13     }
    14     int i,j;
    15     for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
    16     {
    17         s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节
    18         if(s1[i]-'0'>=10)
    19         {
    20             s1[i]=char((s1[i]-'0')%10+'0');
    21             if(i) s1[i-1]++;
    22             else s1='1'+s1;
    23         }
    24     }
    25     return s1;
    26 }
    27 int main(){
    28     string s1[210];
    29     int n; 
    30     s1[0]="0";s1[1]="1";
    31     for(int i=2; i<201; ++i){
    32         s1[i]=sum(s1[i-1],s1[i-2]);
    33     }
    34     while(scanf("%d",&n)!=EOF){
    35         cout<<s1[n+1]<<endl;
    36     }
    37     
    38     return 0; 
    39 }
    View Code

    Problem C

     
     Accepts: 832
     
     Submissions: 6612
     Time Limit: 2000/1000 MS (Java/Others)
     
     Memory Limit: 131072/131072 K (Java/Others)
    Problem Description

    度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:

    1、insert : 往神奇字典中插入一个单词
    
    2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词
    
    3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
    
    Input

    这里仅有一组测试数据。第一行输入一个正整数N(1N100000),代表度熊对于字典的操作次数,接下来NN行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: insert, delete 或者 search)。第二个字符串代表了相关操作后指定的那个字符串,第二个字符串的长度不会超过30。第二个字符串仅由小写字母组成。

    Output

    对于每一个search 操作,如果在度熊的字典中存在给定的字符串为前缀的单词,则输出Yes 否则输出 No。

    map+sort...

    Problem D

     
     Accepts: 2916
     
     Submissions: 8882
     Time Limit: 2000/1000 MS (Java/Others)
     
     Memory Limit: 65536/65536 K (Java/Others)
    Problem Description

    度熊所居住的 D 国,是一个完全尊重人权的国度。以至于这个国家的所有人命名自己的名字都非常奇怪。一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字。例如,如果一个人名字是 ACM,那么 AMC, CAM, MAC, MCA, 等也都是这个人的名字。在这个国家中,没有两个名字相同的人。

    度熊想统计这个国家的人口数量,请帮助度熊设计一个程序,用来统计每一个人在之前被统计过多少次。

    Input

    这里包括一组测试数据,第一行包含一个正整数NN,接下来的NN 行代表了 NN 个名字。NN 不会超过100,000100,000,他们的名字不会超过40位.

    Output

    对于每输入的一个人名,输出一个整数,代表这个人之前被统计了多少次。

    最水的题,不解释啦。。。

    代码:

     1 #include <vector>
     2 #include <map>
     3 #include <set>
     4 #include <algorithm>
     5 #include <iostream>
     6 #include <cstdio>
     7 #include <cmath>
     8 #include <cstdlib>
     9 #include <string>
    10 #include <cstring>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 
    15 char a[100];
    16 map<string,int>str;
    17 
    18 int main()
    19 {
    20     int n;
    21     cin>>n;
    22     while(n--){
    23             cin>>a;
    24             int l=strlen(a);
    25             sort(a,a+l);
    26             cout<<str[a]<<endl;
    27             str[a]++;
    28     }
    29 }
  • 相关阅读:
    使用Windbg调试.Net应用程序 [转]
    jquery的$.extend和$.fn.extend作用及区别
    java获取ip
    在IDEA中使用MyBatis Generator逆向工程生成代码
    github结合TortoiseGit使用sshkey,无需输入账号和密码
    Mapped Statements collection does not contain value for com.xxxx.dao.impl.AreaDAOImpl.findByCode
    idea设置tomcat虚拟路径的两种方法
    spring MVC中传递的参数对象中包含list的情况
    PowerDsigner 16逆向工程导入mysql
    [C++]Qt文本操作(按行读写)
  • 原文地址:https://www.cnblogs.com/wangmengmeng/p/5497320.html
Copyright © 2011-2022 走看看