codeforces271D
Good Substrings
给你一个只包含小写字母的字符串s.
问你在这个字符串中有多少个不同的子串.
且要求这些子串中不得出现超过k个的特殊字母.
*子串s1和子串s2不同,当且仅当s1!=s2,即s1和s2完全不同.
*子串指的是字符串中截取出来的连续的一段.
输入格式第一行,一个长度不超过1500仅包含小写字母的字符串s.
第二行,包含一个长度为26的01字符串,如果字符串的第i(0<=i< length(s))个位置为'0',说明'a'+i为特殊字母,否则'a'+i不是特殊字母.
第三行,包含一个整数k(0<=k<=|s|).输出格式只有一个整数,表示符合要求的不同子串的个数样例
ababab
01000000000000000000000000
1
5
acbacbacaa
00000000000000000000000000
2
8
样例解释对于第一个样例,符合要求的子串分别为:"a", "ab", "b", "ba", "bab".
sol:DIV2的D嘛,直接n2暴力搞出所有子串,然后一开始用set去重,T到怀疑人生,然后用哈希,又WA到死
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int n,m,No[N];
string S,Spe;
bool Bo[];
set<string>Ans;
int main()
{
freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
int i,j;
cin>>S; n=S.size(); S='$'+S;
cin>>Spe; for(i=;i<;i++) if(Spe[i]=='') Bo[i]=;
R(m);
for(i=;i<=n;i++) if(Bo[S[i]-'a']) No[i]=;
for(i=;i<=n;i++) No[i]+=No[i-];
Ans.clear();
for(i=;i<=n;i++) for(j=i;j<=n;j++)
{
if(No[j]-No[i-]>m) break;
else
{
string t; t=S.substr(i,j-i+); Ans.insert(t);
}
}
// set<string>::iterator it;
// for(it=Ans.begin();it!=Ans.end();it++) cout<<*it<<endl;
Wl((int)(Ans.size()));
return ;
}
/*
Input
ababab
01000000000000000000000000
1
Output
5 Input
acbacbacaa
00000000000000000000000000
2
Output
8 input
kqdwdulmgvugvbl
00101010100100100101101110
13
output
114
*/
set(TLE)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
const ll Mod=;
int n,m,Qzh[N];
unsigned long long a[N*N];
char S[N],Sp[];
bool Bo[];
int main()
{
int i,j;
scanf("%s",S+); n=strlen(S+);
scanf("%s",Sp+); for(i=;i<=;i++) if(Sp[i]=='') Bo[i-]=;
R(m);
for(i=;i<=n;i++) {if(Bo[S[i]-'a']) Qzh[i]=; Qzh[i]+=Qzh[i-];}
*a=;
for(i=;i<=n;i++)
{
unsigned long long tmp=;
for(j=i;j<=n;j++)
{
if(Qzh[j]-Qzh[i-]>m) break;
tmp=tmp*Mod+S[j]; a[++*a]=tmp;
}
}
sort(a+,a+*a+);
*a=unique(a+,a+*a+)-a-;
Wl((ll)(*a));
return ;
}
/*
Input
ababab
01000000000000000000000000
1
Output
5 Input
acbacbacaa
00000000000000000000000000
2
Output
8
*/
codeforces271D的更多相关文章
随机推荐
- X86逆向7:特殊窗体的破解思路
本章我们来看两个案例,这两个案例同样使用爆破的方式破解,但是与其他的程序不同,这个程序没有弹窗,提示成功或失败使用的是图片或是一个类似图片的窗体,本章将学习两个新的API函数的使用技巧. ------ ...
- Centos7.3安装Mysql5.7.26(glibc即linux通用版)
1.检查防火墙是否关闭 //查看防火墙状态 firewall-cmd --state //关闭防火墙 systemctl stop firewalld systemctl disable firewa ...
- GNU g++常用编译选项用法
GNU g++常用编译选项用法 本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/30686/showart_1210761.html GCC ...
- js之常用正则
//用户名正则,4到16位(字母,数字,下划线,减号) let uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母, ...
- 第十三章·Kibana深入-使用地图统计客户端IP
地址库 在ELK中,我们可以使用地址库,来对IP进行分析,对日志进行分析,在ELKstack中只有Logstash可以做到,但是出图,是Kibana来出的,所以我们首先需要下载地址库数据文件,然后对L ...
- Darknet的整体框架,安装,训练与测试
目录 一.Darknet优势 二.Darknet的结构 三.Darknet安装 四.Darknet的训练 五.Darknet的检测 正文 一.Darknet优势 darknet是一个由纯C编写的深度学 ...
- 网络基础篇之NAT(原理)
一.NAT的产生 由于网络的飞速发展和网络应用的极速增多,致使IPv4可用地址空间逐渐枯竭.尽管IPv6可以在根本上解决地址枯竭问题,但IPv4发展到IPv6还需要一个过渡,而这便产生了NAT. 二. ...
- [微信小程序]聊天对话(文本,图片)的功能(完整代码附效果图)
废话不多说, 先上图: <!--pages/index/to_news/to_news.wxml--> <view class='tab'> <view class='l ...
- MYSQL获得查询记录的行号
对于获得查询记录的行号这一功能,Oracle 中可以使用标准方法(8i版本以上),也可以使用非标准的ROWNUM,MS SQL Server 则在 2005 版本中提供了ROW_NUMBER()函数. ...
- Some ArcGIS Tools
在矢量叠加,即将同一区域.同一比例尺的两组或两组以上的多边形要素的数据文件进行叠加产生一个新的数据层,其结果综合了原来图层所具有的属性.矢量叠加操作分为:交集(Intersect).擦除(Erase) ...