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的更多相关文章
随机推荐
- kafka运维填坑
转载自:https://www.jianshu.com/p/d2cbaae38014 前提: 只针对Kafka 0.9.0.1版本; 说是运维,其实偏重于问题解决; 大部分解决方案都是google而来 ...
- lesson12Homework
package StringPractice; public class arrayTest { //1. 把A数组的前5个元素复制到B数组中. public static void main(Str ...
- nodejs和npm
Node.js安装及环境配置之Windows篇:https://www.cnblogs.com/liuqiyun/p/8133904.html 淘宝NPM镜像:https://npm.taobao.o ...
- 题解 POJ1964/UVA1330/SP277 【City Game】
题目链接: https://www.luogu.org/problemnew/show/UVA1330 http://poj.org/problem?id=1964 https://www.luogu ...
- 15条SQLite3语句
15条SQLite3语句 转自:http://www.thegeekstuff.com/2012/09/sqlite-command-examples/ SQLite3 is very light ...
- ubuntu下安装python-selenuim自动化测试的谷歌浏览器驱动安装的位置
谷歌插件下载地址 https://npm.taobao.org/mirrors/chromedriver selenium下载地址 https://pypi.org/simple/selenium/ ...
- 创建json对象
jQuery创建json对象 方法二: <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- js小功能2:切换
HTML: <div id="tb"> <ul><li class="on">房产</li><li> ...
- 使用docker搭建OpenResty开发环境
Dockerfile文件: FROM centos:latest RUN yum install -y pcre-devel openssl-devel gcc curl wget perl make ...
- 解决Windows下文件无法删除的问题
一.文件正在使用,文件已在另一程序中打开 图1已经提示了文件具体在哪个程序打开,在任务管理器结束相应的进程就可以删除文件了. 图2其实才是问题关键,怎样知道文件到底被哪个程序占用的呢? 解: Win+ ...