Codeforces 814C - An impassioned circulation of affection
生活随笔
收集整理的這篇文章主要介紹了
Codeforces 814C - An impassioned circulation of affection
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原題鏈接:http://codeforces.com/contest/814/problem/C
題意:有長度為n的一個字符串,q個詢問,每個詢問由數字m和字符c組成,問最多在字符串中替換m個字符,使連續的字符c的長度最大,輸出這個最大值。
?
思路:首先可以想到,替換兩段分開的子串變成連續的字符c肯定不能得到最大值,所以替換的部分必須是連續的一個子串。那么我們可以對于a~z每個字符枚舉字符區間[l,r],區間內可被替換的字符數m對應能得到r-l+1的連續字符長度,一邊枚舉一邊更新最大值。這里我們要求得恰好能被替換成a~z字符的最大次數,當輸入的m超過這個最大次數,輸出字符串長度n。
?
AC代碼:
#include<iostream> #include<string> #include<cstdio> #include<cstring> using namespace std; int res[27][1505],num[27][1505]; int maxx[27]; int main() {char str[1505];int n,q;char ch;scanf("%d", &n);scanf("%s", str);memset(res, 0, sizeof(res));memset(num, 0, sizeof(num));memset(maxx, 0, sizeof(maxx));for(int i=0;i<26;i++){for(int j=1;j<=n;j++){if(str[j-1]-'a'==i)num[i][j]=num[i][j-1]+1;elsenum[i][j]=num[i][j-1];num[i][j-1]=j-1-num[i][j-1];} num[i][n]=n-num[i][n];}int x;for(int k=0;k<26;k++){for(int r=1;r<=n;r++){for(int l=r;l>0;l--){x=num[k][r]-num[k][l-1];res[k][x]=max(res[k][x], r-l+1);maxx[k]=max(maxx[k], x);}}}scanf("%d", &q);int num;for(int i=0;i<q;i++){scanf("%d %c", &num, &ch);if(maxx[ch-'a']<=num)printf("%d\n", n);elseprintf("%d\n", res[ch-'a'][num]);}return 0; }?
轉載于:https://www.cnblogs.com/MasterSpark/p/7436294.html
總結
以上是生活随笔為你收集整理的Codeforces 814C - An impassioned circulation of affection的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邮储手机银行怎么升级一类卡
- 下一篇: java版本微信jssdk、微信验证签名