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 }