codeforces 521a//DNA Alignment// Codeforces Round #295(Div. 1)
阿新 • • 發佈:2018-09-15
stdin cto string open 註意 count syn div res
題意:如題定義的函數,取最大值的數量有多少?
結論只猜對了一半。
首先,如果只有一個元素結果肯定是1.否則。s串中元素數量分別記為a,t,c,g。設另一個串t中數量為a‘,t‘,c‘,g‘。那麽,固定s串,移動t串時,增加的量為p=a*a‘+t*t‘+c*c‘+g*g‘。註意a‘+t‘+c‘+g‘是等於串長,那麽減少a,t,c,g中最少的對應的那個a‘,t‘,c‘,g‘,增加到最大的那個上,p值是上升的。而且如果a==t那麽a‘和t‘的數量互換是不影響p值的。因此結論是這種情況下,t串可隨意 放出現最多的元素。結果是(一樣多且最多的字母個數)^(t長度)
亂碼:
//#pragma comment(linker,"/STACK:1024000000,1024000000")#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> #include <stack> #include <list> usingnamespace std; const int SZ=1000010,INF=0x7FFFFFFF; typedef long long lon; int num[4]; lon mod=1000000007; lon pow(lon btn,lon n) { lon res=1,ele=btn; for(;n;) { if(n&1)res*=ele; ele*=ele; res%=mod; ele%=mod; n/=2; } return res; } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); int n; cin>>n; string str; cin>>str; num[0]=count(str.begin(),str.end(),‘A‘); num[1]=count(str.begin(),str.end(),‘T‘); num[2]=count(str.begin(),str.end(),‘C‘); num[3]=count(str.begin(),str.end(),‘G‘); int maxn=*max_element(num,num+4); int maxnum=count(num,num+4,maxn); if(maxnum==1) { cout<<1<<endl; } else { cout<<pow((lon)maxnum,(lon)str.size())<<endl; } return 0; }
codeforces 521a//DNA Alignment// Codeforces Round #295(Div. 1)