哎掉分ing。比赛时直接被这题吓住了,后来看了下Tutorial,顿悟了,感觉自己的思维真是还很渣呢。
What is ρ(s, t) equal to? For every character of s and every character of t there is a unique cyclic shift of t that superposes these characters (indeed, after 0, ..., n - 1 shifts the character in t occupies different positions, and one of them matches the one of the character of s); therefore, there exist n cyclic shifts of s and t that superpose these characters (the situation is symmetrical for every position of the character of s). It follows that the input in ρ from a single character ti is equal to n × (the number of characters in s equal to ti). Therefore, ρ(s, t) is maximal when every character of t occurs the maximal possible number of times in s. Simply count the number of occurences for every type of characters; the answer is Kn, where K is the number of character types that occur in s most frequently. This is an O(n) solution.
题解大意就是ρ的值可以由式子求出:ρ=n*(ta*sa+tc*sc+tg*sg+tt*st),ta等为t中A的个数。
于是这么想,sa+sc+sg+st和ta+tc+tg+tt都为定值n,如何让式子值最大,假设tg tt不变,sa>sc,如果t中一个a变为c,那么ρ就变小了,所以就是sa sc sg st中大的数字,那个字母尽可能多。
如是就统计s中有多少个ACGT,如果A最多,那么t就全是A,如果A和G一样多,那么t的每一位可以为A也可以是G。
<span style="font-size:10px;">#include<bits/stdc++.h>>//新的头文件好炫酷
using namespace std;
#define MAX 20000+5
typedef long long LL;
const double pi=3.141592653589793;
const int INF=1e8;
const double inf=1e20;
const double eps=1e-6;
const int mod=1000000007;
int main(){
int n,a[30];
string s;
cin>>n>>s;
a['A'-'A']=0;
a['C'-'A']=1;
a['G'-'A']=2;
a['T'-'A']=3;
int b[4]={0,0,0,0};
int len=s.size();
for(int i=0;i<len;i++) b[a[s[i]-'A']]++;
int maxn=max(max(b[0],b[1]),max(b[2],b[3]));
int size=0;
for(int i=0;i<4;i++) if(b[i]==maxn) size++;
LL ans=1;
for(int i=0;i<len;i++) ans=(ans*size)%mod;
printf("%I64d\n",ans);
return 0;
}
</span>