Codeforces Round #418 (Div. 2) C. An impassioned circulation of affection(双指针)

题目链接:Codeforces Round #418 (Div. 2) C. An impassioned circulation of affection

题意:

给你一个字符串,有q个询问,每个询问一个x和一个字符 o。

现在让你在原来的字符串上最多改变x个字符,问能构成最长的o子串的长度。

题解:

一共有26*1500种状态,对于每个状态用双指针滚一滚就行了。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=(a);i<=(b);++i)
 3 using namespace std;
 4
 5 const int N=1507;
 6 int ans[27][N],n,k,x;
 7 char s[N],o[2];
 8
 9 int del(int i,int j)
10 {
11     int ans=0;
12     for(int l=1,r=1,cnt=0;r<=n;r++)
13     {
14         cnt+=s[r]!=j;
15         if(cnt<=i)ans=max(ans,r-l+1);
16         while(l<=r&&cnt==i+1)cnt-=s[l]!=j,l++;
17     }
18     return ans;
19 }
20
21 int main(){
22     scanf("%d%s",&n,s+1);
23     F(i,1,n)s[i]-=‘a‘;
24     F(i,0,25)F(j,1,n)ans[i][j]=del(j,i);
25     scanf("%d",&k);
26     while(k--)
27     {
28         scanf("%d%s",&x,o),o[0]-=‘a‘;
29         printf("%d\n",ans[*o][x]);
30     }
31     return 0;
32 }

时间: 2024-11-12 00:37:50

Codeforces Round #418 (Div. 2) C. An impassioned circulation of affection(双指针)的相关文章

Codeforces Round #418 (Div. 2)

A - An abandoned sentiment from past 由于所有的数组B内所有的数都不同,因此当k > 1是就可以使该序列不递增 当k = 1是,带入B[0],判断序列A是否递增就可以啦 #include <bits/stdc++.h> using namespace std; const int MAXN = 100008; int a[MAXN], b[MAXN]; int main() { int n, k; scanf("%d%d", &am

Codeforces Round #418 (Div. 2)D

给n个圆要么包含,要么相分离,没有两个公共点,当成一棵树,把包含的面积大的放在上面 如图最上面的par记为-1,level记为0,当par==-1||level==1时就加否则减, 就是第一,二层先加,第三层减,然后后面的一直交替就行了 #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #includ

Codeforces Round #418 (Div. 2) C

Description Nadeko's birthday is approaching! As she decorated the room for the party, a long garland of Dianthus-shaped paper pieces was placed on a prominent part of the wall. Brother Koyomi will like it! Still unsatisfied with the garland, Nadeko

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除