2015-03-02 22:19:15

总结:比赛就做了个A,题意比较晦涩,难度中等... 24minAC(速度中等-。-)

  QUQ 回到紫名辣,哈哈~

  ※:比赛中想到了B的解法,死活wa4,赛后改了改TLE,最终把vector换成数组,AC了。

     然后,把C题给补了。

A:核心在于考虑到s中的每个字符会与t中的每个字符匹配n次。

   统计一下s中A,C,G,T这四个字符每个字符的出现次数c1~c4。

  可以发现,如果有个字符出现次数大于其他字符,那么构造的t串肯定都由该字符组成,t仅有1种。

  然后进一步,如果出现次数最大的字符有两个,那么构造的t串肯定由这两个字符组成,t有2^n种。

  同理,如果出现次数最大的字符有三个,t有3^n种....。如果四个字符出现次数相等,t有4^n种。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <queue>
10 #include <string>
11 #include <iostream>
12 #include <algorithm>
13 using namespace std;
14 
15 #define MEM(a,b) memset(a,b,sizeof(a))
16 #define REP(i,n) for(int i=1;i<=(n);++i)
17 #define REV(i,n) for(int i=(n);i>=1;--i)
18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
20 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
21 #define MP(a,b) make_pair(a,b)
22 
23 typedef long long ll;
24 typedef pair<int,int> pii;
25 const int INF = (1 << 30) - 1;
26 const ll MOD = 1e9 + 7;
27 
28 int n;
29 char s[100010];
30 int cnt[10];
31 
32 ll Q_pow(int x,int y){
33     ll res = 1,X = x;
34     while(y){
35         if(y & 1) res = (res * X) % MOD;
36         y >>= 1;
37         X = (X * X) % MOD;
38     }
39     return res;
40 }
41 
42 bool cmp(int a,int b){
43     return a > b;
44 }
45 
46 int main(){
47     scanf("%d",&n);
48     scanf("%s",s + 1);
49     for(int i = 1; i <= n; ++i){
50         if(s[i] == 'A') cnt[1]++;
51         else if(s[i] == 'C') cnt[2]++;
52         else if(s[i] == 'G') cnt[3]++;
53         else cnt[4]++;
54     }
55     sort(cnt + 1,cnt + 4 + 1,cmp);
56     if(cnt[1] > cnt[2]) printf("1\n");
57     else if(cnt[1] == cnt[2] && cnt[2] > cnt[3])
58         printf("%I64d\n",Q_pow(2,n));
59     else if(cnt[1] == cnt[2] && cnt[2] == cnt[3] && cnt[3] > cnt[4])
60         printf("%I64d\n",Q_pow(3,n));
61     else printf("%I64d\n",Q_pow(4,n));
62     return 0;
63 }
View Code

相关文章: