CodeForces - 1307C Cow and Message(思维)
生活随笔
收集整理的這篇文章主要介紹了
CodeForces - 1307C Cow and Message(思维)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出一個字符串,在這個題目中的子序列定義為,出現次數必須是等差數列的序列,如:aaabb的其中一個子序列就是aab,其出現的位置是1 3 5,呈等差數列,現在問,在這個題目中出現次數最多的子序列,出現的次數是多少
題目分析:又是一道讀完題后猜出正解,但因為實現一直WA的題目,其實讀完題后,再參照樣例,可以猜個差不多的結論,那就是對答案有貢獻的子序列,長度不是 1 就是 2 ,因為自己舉了幾個例子后發現,如果存在一個長度大于 2 的子序列,那么其長度必定可以拆成長度為 1 的或者長度為 2 的,這樣一來我們就發現等差數列的這個條件也就變成了煙霧彈,因為長度為 1 和長度為 2 的子序列無論如何組合,都肯定是等差數列
有了上面的猜想就不難實現了,長度為 1 的子序列就是統計一下每個字母出現的次數,取最多的那個字母就行了,而長度為二的子序列,我用了一種比較笨的方法,那就是直接暴力枚舉兩個字母,時間復雜度是 n * 26 * 26 ,不過也無傷大雅,枚舉的這兩個字母是不相同的,而相同的我們可以利用排列組合 C( mmax , 2 ) 計算得出,這里的 mmax 就是剛才求出的,出現次數最多的字母了
代碼:
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;char s[N];LL cnt[N][26];//前綴和int main() { //#ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); //#endif // ios::sync_with_stdio(false);scanf("%s",s+1);int len=strlen(s+1);for(int i=1;i<=len;i++){for(int j=0;j<26;j++)cnt[i][j]=cnt[i-1][j];cnt[i][s[i]-'a']++;}LL mmax=0;for(int i=0;i<26;i++)mmax=max(mmax,cnt[len][i]);mmax=max(mmax,(mmax-1)*mmax/2);for(int j=0;j<26;j++)for(int k=0;k<26;k++){if(j==k)continue;LL temp=0;for(int i=1;i<=len;i++)if(s[i]==char(k+'a'))temp+=cnt[i][j];mmax=max(mmax,temp);}printf("%lld\n",mmax);return 0; }?
總結
以上是生活随笔為你收集整理的CodeForces - 1307C Cow and Message(思维)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1307B C
- 下一篇: CodeForces - 1307D C