Codeforces Round #166 (Div. 2) D - Good Substrings

集成电路模拟版图入门-版图基础学习笔记(一) 集成电路设计模拟版图入门笔记,了解版图的定义、意义、工具、设计流程。认识版图及版图组成的两大部件,版图编辑器有哪些,电路图编辑器,了解工艺厂商等。 阅读详情

题意说的很清楚了,就是要寻找满足某一条件的不同字串个数。

方法一:

寻找不同字串个数体型很直接的一种方法就是把字符串hash值保存在set或者数组中,统计其中不同的个数。

//一个长为n的字符串的字串个数为n*(n+1)/2
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<set>
#define multiple 1000000007   //这里multiple如果选的太小(31,37,41)效果不如大点(131,1000000003,1000000007)好
using namespace std;
int main(){
    int i,j;
    int n,k;
    char str[2000],str1[50];
    int sum[2000];
    memset(sum,0,sizeof(sum));
    scanf("%s",str);
    scanf("%s",str1);
    scanf("%d",&k);
    for(i=1;i<=strlen(str);i++){
        sum[i]=sum[i-1]+(str1[str[i-1]-'a']=='0');
    }
    long long h[1500*1500];
    int pos=0;
    for(i=1;i<=strlen(str);i++){
        long long tem=0;
        for(j=i;j<=strlen(str);j++){
            if(sum[j]-sum[i-1]>k)break;
            tem=tem*multiple+str[j-1];
            h[pos++]=tem;
        }
    }
    sort(h,h+pos);
    printf("%d\n",unique(h,h+pos)-h);
}


方法二:

如果直接用set存放所有的hash值,再统计大小则会超时,解决办法是,只把长度不同的字符串的hash值放到不同的set中统计则会快很多。

//一个长为n的字符串的字串个数为n*(n+1)/2
//strlen卡了我十倍的时间,一定要预处理
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<set>
#define multiple 1000000007   //这里multiple如果选的太小(31,37,41)效果不如大点(131,1000000003,1000000007)好
typedef long long ll;
using namespace std;
int main(){
    int i,j;
    int n,k;
    char str[2000],str1[50];
    int sum[2000];
    memset(sum,0,sizeof(sum));
    scanf("%s",str);
    scanf("%s",str1);
    scanf("%d",&k);
    n=strlen(str);
    for(i=1;i<=n;i++){
        sum[i]=sum[i-1]+(str1[str[i-1]-'a']=='0');
    }
    int ans=0;
    //ll s[2000];
    //int pos=0;
    set<ll>s;
    ll head=0,tem=0,last=1;
    for(i=1;i<=n;i++){
        s.clear();
        //pos=0;
        head=head*multiple+str[i-1];
        if(sum[i]-sum[0]<=k){
            s.insert(head);
            //s[pos++]=head;
        }
        tem=head;
        for(j=2;j+i-1<=n;j++){
            tem=(tem-str[j-2]*last)*multiple+str[j+i-2];
            if(sum[i+j-1]-sum[j-1]>k)continue;
            s.insert(tem);
            //s[pos++]=tem;
        }
        //sort(s,s+pos);
        //ans+=unique(s,s+pos)-s;
        ans+=s.size();
        last*=multiple;
    }
    printf("%d\n",ans);
}

方法三:用trie图统计字串

#include<cstdio>
#include<cstring>
#include<queue>
#define MAXN 2000
#define ALP 26
typedef long long ll;
using namespace std;
int n,k;
char s[2000];
int next[MAXN*MAXN][ALP],pos;
int sum[2000];
int ans;
int newnode(){
    for(int i=0;i<ALP;i++)next[pos][i]=0;
    return pos++;
}
void insert(char *s,int start){
    int p=0;
    for(int i=0;s[i];i++){
        if(sum[start+i+1]-sum[start]>k)break;
        int k=s[i]-'a',&x=next[p][k];
        if(x==0){
            x=newnode();
            p=x;
            ans++;
        }
        else
            p=x;
    }
}
int main(){
    int i,j;
    char str[50];
    pos=0,newnode();
    memset(sum,0,sizeof(sum));
    scanf("%s",s);
    scanf("%s",str);
    scanf("%d",&k);
    n=strlen(s);
    for(i=1;i<=n;i++){
        sum[i]=sum[i-1]+(str[s[i-1]-'a']=='0');
    }
    ans=0;
    for(int i=0;i<n;i++){
        insert(s+i,i);
    }
    printf("%d\n",ans);
    return 0;
}



方法四:用后缀数组统计子串

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 2010
char r[MAXN];
int sa[MAXN];
int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN];
int height[MAXN],rank[MAXN];
int sum[2000],k;
inline bool cmp(int *r,int a,int b,int len){
    return r[a]==r[b]&&r[a+len]==r[b+len];
}
void SA(int n,int m){
    int i,j,p,*x=wa,*y=wb,*t;
    for(i=0;i<m;i++)
        ws[i]=0;
    for(i=0;i<n;i++)
        ws[x[i]=r[i]]++;
    for(i=1;i<m;i++)
        ws[i]+=ws[i-1];
    for(i=n-1;i>=0;i--)
        sa[--ws[x[i]]]=i;
    for(j=p=1;p<n;j<<=1,m=p){
        for(p=0,i=n-j;i<n;i++)
            y[p++]=i;
        for(i=0;i<n;i++){
            if(sa[i]>=j)
                y[p++]=sa[i]-j;
        }
        for(i=0;i<m;i++)
            ws[i]=0;
        for(i=0;i<n;i++)
            ws[wv[i]=x[y[i]]]++;
        for(i=1;i<m;i++)
            ws[i]+=ws[i-1];
        for(i=n-1;i>=0;i--)
            sa[--ws[wv[i]]]=y[i];
        for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++)
            x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
    }
}
void Height(int n){
    int i,j,k=0;
    for(i=1;i<=n;i++)
        rank[sa[i]]=i;
    for(i=0;i<n;height[rank[i++]]=k)
        for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
}
void solve(int n){
    int i,j;
    int ans=0;
    for(i=1;i<=n;i++){
        for(j=sa[i]+height[i];j<n;j++){
            if(sum[j+1]-sum[sa[i]]>k)break;
            ans++;
        }
    }
    printf("%d\n",ans);
}
int main(){
    int i,j,n;
    char str[50];
    memset(sum,0,sizeof(sum));
    scanf("%s",r);
    scanf("%s",str);
    scanf("%d",&k);
    n=strlen(r);
    for(i=1;i<=n;i++){
        sum[i]=sum[i-1]+(str[r[i-1]-'a']=='0');
    }
    memset(height,0,sizeof(height));
    SA(n+1,130);
    Height(n);
    solve(n);
}



移动通信基础(13)TDL、CDL、信道相关性 参考《U型槽无线信道多径传播特性测量与建模方法的研究》、《5G信号源中的信道模拟与仿真研究》衰落衰落理解为信号幅度在时间和频率上的不断波动,是无线信道一个重要的恶化特性。信道幅度恶化的两个主要来源分别是加性噪声和信号衰落,高斯白噪声信道模型就是典型的加性噪声,信号衰落引起的是乘性的信号扰动,与加性噪声从原理上完全不同。信道的频率选择性衰落组为无线信道的重要特征之一,是人们进行无线系统设计考虑的重要因素,决定了导频隔间的大小。... 阅读详情

相关推荐

第十九届全国大学生智能车竞赛越野信标 硬件篇

全国大学生智能汽车竞赛,越野信标组

2301_77568650的博客 4115

D. Good Substrings(Trie树高效判重)

题目链接———— 题意大致是给一个字符串s,然后给26个字母一个权,0或者1,0代表着坏字符,1代表着好字符。然后给你给你一个k,求所有s的坏字符少于k的子串。 Trie树,一般分建树和查询。这个题目可以把建树和查询放在一起。大大提高效率! AC Code: #include<bits/stdc++.h> using namespace...

一身清贫怎敢入繁华 449

可变形卷积(Deformable Conv)原理解析与torch代码实现

图6为可变形卷积示意图。图1所示为普通卷积在输入特征图上进行卷积计算的过程,卷积核大小为3*3,在输入特征图尺寸为7*7上进行卷积,将卷积核权重与输入特征图对应位置元素相乘并求和得到输出特征图元素,按一定方式滑动窗口就能计算得到整张输出特征图。图6所示,在input feature map上普通卷积操作对应卷积采样区域是一个卷积核大小的正方形(绿框),而可变形卷积对应的卷积采样区域为一些蓝框表示的点,这就是可变形卷积与普通卷积的区别。先来一张图感受一下,图3为标准卷积与可变形卷积的卷积示例。

panghuzhenbang的博客 5万+

D. Good Substrings(双模数哈希)

https://codeforces.com/problemset/problem/271/D You've got strings, consisting of small English letters. Some of the English letters aregood, the rest arebad. A substrings[l...r](1 ≤ l ≤ r ≤ |s|) of strings  =  s1s2...s|s|(where|s|is the len...

代码笔记本 806

保姆级教程:在STM32CubeIDE上快速部署micro_ros到STM32F407(附常见问题解决)

本文提供了一份详细的保姆级教程,指导开发者如何在STM32CubeIDE上快速部署micro_ros到STM32F407微控制器。内容涵盖从Windows与Ubuntu双环境搭建、micro-ROS静态库编译、STM32CubeIDE工程深度集成,到串口通信联调与常见问题解决的完整流程,旨在帮助读者构建稳定可靠的ROS2与嵌入式设备通信系统。

o4p5q6r7s的博客 324

【精细解读】xapp585(多通道LVDS接口ADC)

xapp585的参考设计有Verilog和VHDL两种源码。

FPGA艺术家的博客 532

Codeforces 271D. Good Substrings (后缀数组+前缀和)

题目: http://codeforces.com/problemset/problem/271/D 题意: 给定一个字母串s,给定每个字母是good/bad字母; 一个子串如果包含的bad字母数&lt;=k,则为一个good串; 求有多少个good串。 分析: 首先可以用前缀和处理出s[0]~s[i]有多少个bad字母,用sum[i]表示; 则可以 O(1) 地查询任意一个串是否是good串; ...

OI -> ACM -> AI 728

点云从入门到精通技术详解100篇-基于三维点云的机器人抓取位姿检测(续)

集到的深度信息会存在噪点,因此需要将生成的场景点云进行预处理,获得平滑、降采样处理场景点云,本文设计的预处理操作更能从冗杂的场景点云中提取清晰、平滑的目标点云,便于后续的抓取位姿采样,提高后续算法的处理效率。因此需要对场景点云进行适当的分割,仅保留目标物体的点云,整个过程可以通过。场较小时,空间中的点云密度会更加提高;觉子系统的效率,再保持全局点云几何形状不改变的前提下,通过对目标点云进行。体素降采样可以快速地减少点云数据并同时保持点云的形。个点,由于我们实施抓取的目标物体只占整个场景点云图的一部分,

getusushu的博客 774

CodeForces - 271D:Good Substrings(字符串hash)

Discription You’ve got string s, consisting of small English letters. Some of the English letters are good, the rest are bad. A substring s[l…r] (1 ≤ l ≤ r ≤ |s|) of string s  =  s1s2…s|s| (where |s| ...

No Pain, No Gain . 363

【通信协议】GATT 与 BLE HID 工作原理详解

详细介绍BLE HID 跟GATT工作原理与两者的交互关系

以实战经验介绍行业知识 843

Qt入门教程【基础控件篇】QLineEdit输入框

QLineEdit输入框

小鱼酱的博客 3262

G3. Good Substrings

http://codeforces.com/contest/316/problem/G3 利用RMQ 求 后缀的前缀在每个串里面的个数 二分每个后缀满足要求的最大和最小前缀长度 我用了十个后缀数组 代码写得有些拖沓 #include #include #include using namespace std; #define lson l,m,rt<<1 #define rson

BryantMark 1066

Android 14.0 开机广播接收慢广播延迟问题分析

在14.0的系统rom定制化开发中,在某些时候在接收开机广播的时候发现,过了一分钟才收到开机广播,接下来就需要分析下 开机广播的相关分发机制,来处理下相关问题

安卓兼职framework和app工程师的博客 631

【Codeforces Round #166 (Div. 2) D】【hash】Good Substrings

暴力截取字符串,和算出坏值, 去重就用hash

蒟蒻的OI路 298

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Codeforces Round #166 (Div. 2)---D. Good Substrings(字符串)

You’ve got string s, consisting of small English letters. Some of the English letters are good, the rest are bad.A substring s[l…r] (1 ≤ l ≤ r ≤ |s|) of string s  =  s1s2…s|s| (where |s| is the length

Alex 833

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Codeforces Round #166 (Div. 2)】D. Good Substrings【哈希】

解题思路 以b的个数为关键字,做一个前缀和,然后枚举区间左右端点,i,j,a[j]-a[i-1]如果<=k,说明这段字符是合法的,但是考虑到要求重,要先做一个哈希预处理 base[0]=1ll; for(int i=1;i<=len;i++) { h[i]=(h[i-1]*p*1ll+(s[i]-'a'+1ll)); base[i]=(base[i-1]*p*1ll); } 然后当前字符串的哈希值就是x=h[j]−h[i−1]∗base[j−i+1];x=h[j]-h[i-...

在人间贩卖声音 233

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Codeforces Round #166 (Div. 2) D.Good Substrings【STL】

STL set

JA_yichao欢迎你 cnblogs账号:https://www.cnblogs.com/mayichao/ 356

Codeforces Round #166 (Div. 2) D. Good Substrings 罕见的哈希冲突

D. Good Substrings time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output You've got string s, consisting of small

liwei的专栏 1288

Codeforces Round #166 (Div. 2) D. Good Substrings (前缀和)

原题地址:http://codeforces.com/contest/271/problem/D 题意:每个字母有被赋予好坏的含义,现在要求某一个字符串有多少不同的子串的中的”坏字母”的数量&lt;=k&lt;=k1−i1−i1-i的范围内有多少坏的字母,这样子在后面枚举每一个子串的时候就能快速判断是否合法.判断字符串是否相同用哈希即可. #include &lt;bits/stdc++....

yiqzq的博客 329

Codeforces Round #166 (Div. 2) D. Good Substrings——后缀自动机

题意:规定每一个字符的”好坏“,求字符串中坏的字符不超过k个的不同的子串有多少个。 数据量是允许n^2的算法过的,一看坏字符的个数是满足区间减法的,就反应过来可以用hash搞了。但是自动机肯定也可以做的。 按照拓扑序遍历每个状态,如果当前状态p的pre状态所表示的最长的子串的坏字符个数大于k的话,那这个状态所表示的子串肯定都不满足条件;否则我们就计算出该状态所表示的所有子串中满足条件有多少个,

cool_Fires的专栏 845

Codeforces Round #166 (Div. 2)D. Good Substrings(字符串散列)

D. Good Substrings time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output You've got string s, consisting of small Eng...

weixin_33725126的博客 114

Hash练习题:【Codeforce round #166 】 D. Good Substrings

来源:http://codeforces.com/contest/271/problem/D D. Good Substrings time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard ou

NOI2015的专栏 611

codeforces D Good Substrings(hash)

选择P和M,刚开始使用131和1000000009提交出错,换成1000000009和Long.MAX_VALUE提交成功。在处理出错字符个数不超过k时,在循环中统计出错字符个数提交超时,改成预处理,计算前缀中出错字符个数,在计算区间内出错字符个数时,可以直接使用两个前缀相减计算得到区间内的出错字符个数。 代码参考: https://github.com/wuli2496/OJ/blob/master/codeforces/D%20Good%20Substrings.java ...

多看多听多总结 396

D. Good Substrings(cf)字符串哈希

原题链接:Problem - 271D - Codeforces 其实就是暴力字符串哈希 + 判重 注意:找所有满足条件且重复的不算的情况:set非常慢,如果用set来判重的话会很耗时间。所以可以把所有数据用vector来存,然后用unique来把重复的数都放在后面去,记得一定要先sort一遍: //ans即为所有答案个数 sort(v.begin(), v.end()); ll ans = unique(v.begin(), v.end()) - v.begin(); 时间短的是用v.

qq_52313416的博客 376

CodeForces - 271D Good Substrings(前缀处理+暴力枚举+哈希优化)

D. Good Substrings description You’ve got string s, consisting of small English letters. Some of the English letters are good, the rest are bad.   A substring s[l…r] (1 ≤ l ≤ r ≤ |s|) of string s  =  ...

qq_43627100的博客 373

codeforces 451 D.Count Good Substrings (思维)

D. Count Good Substrings time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output We call a string good, if after me

pluto227的专栏 515
上一篇: JAVA中的Arrays类
下一篇: POJ 3275
Benzema67
博客等级 码龄15年 120粉丝 357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值