AtCoder-Contest122-C题-GetAC之前缀和预处理

本文介绍了一种通过一维前缀和预处理方法解决特定字符串查询问题的技术。该方法可以在O(n+m)的时间复杂度内高效地计算出指定区间内的AC子列数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C题传送门

题目的意思大概就是给你一个长度为N的字符串,M次询问区间,问你L,R中有多少个AC子列

这种题很明显是要预处理的,简单的一维前缀和处理,否则肯定超时

前缀处理只需要O(n+m)

开一个数组,下标 i 表示到第 i 个位置有多少个AC

所有答案所求的区间就可以之间相减结果 ,而不用循环去找

题面如下:

样例:

输入
8 3
ACACTACG
3 7
2 3
1 8
输出:
2
0
3

我的AC代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main(){
    int n , m;
    cin>>n>>m;
    getchar();
    string str;
    getline( cin , str );
    
    int cnt[n];
    fill( cnt , cnt + n , 0 );
    for( int i = 1 ; i < str.length() ; i++ ){
    	if( str[i] == 'C' ){
    		if( str[i - 1] == 'A' ){
    			cnt[i] += cnt[i - 1] + 1;
			}
			else{
				cnt[i] += cnt[i - 1];
			}
		}
		else cnt[i] += cnt[i - 1];
	}
	
//	for( int i = 0 ; i < n ; i++ ){
//		cout<<cnt[i]<<" ";
//		if( i == n - 1 ) cout<<'\n';
//	}
    for( int i = 0 ; i < m ; i++ ){
    	int l , r;
    	cin>>l>>r;
    	cout<<cnt[r - 1] - cnt[l - 1]<<'\n';
	}
    
    return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值