百度之星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\n",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 }

 

 

posted @ 2016-05-16 10:54  Vmetrio  阅读(353)  评论(0编辑  收藏  举报