BestCoder #81 Div2 C String(尺取法)

题目链接:
BestCoder #81 Div2 C String
题意:
有一个10≤长度≤1,000,000 的字符串,仅由小写字母构成。求有多少个子串,包含有至少k(1≤k≤26)个不同的字母?
分析:
假设从s[0]到s[i]正好第一次满足出现K个不同的字母,那么从i开始到字符串尾都是满足的,一共是len-i个。0–i范围内的K个不同字母的子串还是可以缩短的,从0开始向后移动直到一个字母s[i]恰好出现一次,如果不包含s[j]一定只含有K-1个不同的字母,所以j是起始端的上限,一共是j-st+1个,所以这一次一共有(j-st+1)*(len-i)个不同的子串,更新st为j+1,i向后继续搜索。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
using namespace std;
const int MAX_N=(int)(1e6)+10;

int T,K,vis[30];
char s[MAX_N];

int main()
{
    freopen("81Cin.txt","r",stdin);
    scanf("%d",&T);
    while(T--){
        scanf("%s%d",s,&K);
        int len=strlen(s);
        int st=0,total=0;
        long long ans=0;
        memset(vis,0,sizeof(vis));
        for(int i=0;i<len;i++){
            if(vis[s[i]-'a']==0){
                vis[s[i]-'a']=1;
                total++;
                if(total==K){
                    int j=st;
                    for(j=st;vis[s[j]-'a']!=1;j++){
                        vis[s[j]-'a']--;
                    }
                    //printf("st=%d j=%d i=%d\n",st,j,i);
                    ans+=(j-st+1)*(len-i);
                    st=j+1;
                    total--;
                    vis[s[j]-'a']=0;
                }
            }else {
                vis[s[i]-'a']++;
            }
        }
        printf("%lld\n",ans);
    }   
    return 0;
}
内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证不同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值