codeforces上某题
一道codeforces上的题目。
题目大意:
定义有k个不同的字符的字符串为好字符串。现在给出一个字符串,求解对该字符串的每个前缀Si至少是多少个好字符串的连接,若不能由好字符串连接而成则输出-1。
例:k = 2
abac至少是ab和ac这两个好字符串的连接。
字符串长度<=2e5
看了一下网上的题解都是这样子的
DP+数据结构
尺取+dp+线段树
比较麻烦。
列出基本DP式:f[i]={f[j]+1} S(j+1)-i为好串
显然对于i,满足条件的j的区间是单调不降的,因此,可以放一个指针j在i后面,若j-i的串超过限制或f[j]==-1,j直接向前跳,因为满足条件的j区间单调不降,所以前面的f[]是没用的。由于f[]单调不降,所以跳到k>=num就停,然后更新答案,这样一定最优。
代码:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<cstdlib>
using namespace std;
#define ll long long
#define up(i,j,k) for(int i=(j);i<=(k);i++)
#define cmin(a,b) a=min(a,b)
#define cmax(a,b) a=max(a,b)
#define pii pair<int,int>
const int maxn=,inf=1e9,mod=1e9+;
int read(){
int ch=getchar(),x=,f=;
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')x=(x<<)+(x<<)+ch-'',ch=getchar();
return f*x;
} int f[maxn];
char s[maxn];
int k,n;
int vis[],num=;
void add(int x){
vis[x]++;
if(vis[x]==)num++;
}
void erase(int x){
vis[x]--;
if(!vis[x])num--;
}
int main(){
k=read();scanf("%s",s+);n=strlen(s+);
int sum=-,head=;
for(int i=;i<=n;i++){
add(s[i]-'a');
while((num>k||f[head]==-)&&head<i)erase(s[++head]-'a');
if(f[head]==-||num!=k)f[i]=-;
else f[i]=f[head]+;
}
up(i,,n)printf("%d%c",f[i],i==n?'\n':' ');
return ;
}
codeforces上某题的更多相关文章
- Codeforces VP/补题小记 (持续填坑)
Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径. 考虑括号序列维护树的路径信息和,是将左括号看做 ...
- onhashchange事件,只需要修改hash值即可响应onhashchange事件中的函数(适用于上一题下一题和跳转页面等功能)
使用实例: 使用onhashchange事件做一个简单的上一页下一页功能,并且当刷新页面时停留在当前页 html: <!DOCTYPE html><html><body& ...
- CodeForces813E:Army Creation (主席树---上一题的加强版)
As you might remember from our previous rounds, Vova really likes computer games. Now he is playing ...
- leetcode-cn上面刷题
https://leetcode-cn.com/problemset/database/ ------------------------------------------------------- ...
- Codeforces & Atcoder神仙题做题记录
鉴于Codeforces和atcoder上有很多神题,即使发呆了一整节数学课也是肝不出来,所以就记录一下. AGC033B LRUD Game 只要横坐标或者纵坐标超出范围就可以,所以我们只用看其中一 ...
- CodeForces - 427B (模拟题)
Prison Transfer Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Sub ...
- CodeForces - 404B(模拟题)
Marathon Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Sta ...
- 做了codility网站上一题:CountBoundedSlices
在写上一随笔之前,在Codility网站上还做了一个道题(非Demo题):CountBoundedSlices,得了60分(害臊呀).今天又重新做了一下这个算法,性能提高了不少,但由于此题不是Demo ...
- codeforces #261 C题 Pashmak and Buses(瞎搞)
题目地址:http://codeforces.com/contest/459/problem/C C. Pashmak and Buses time limit per test 1 second m ...
随机推荐
- 第一百八十七节,jQuery,知问前端--cookie 插件,注册成功后生成cookie,显示登录状态
jQuery,知问前端--cookie 插件 学习要点: 1.使用 cookie 插件 2.注册直接登录 Cookie 是网站用来在客户端保存识别用户的一种小文件.一般来用库可以保存用户登 录信息.购 ...
- [浪风分享]App必死 Web永生 看Web的前世今生 必会卷土重来
当我们回顾技术的演变历史时,我们也应该关注技术演变的背后逻辑. 几年前,美国的<连线>杂志发表了“Web已死,Internet永生”的文章,由于作者之一是长尾理论的提出者克里斯.安德森(C ...
- cookie小细节
设置cookie时,不像设置session,可以马上生效,它的生效时间是下一次请求页面.
- python3----ASCII
>>>print ord("a") 97 >>>print chr(97) a
- CImg的使用,入门
CImg的使用: const char *imageIN="image.jpg" const char *imageOUT="imgeout.jpg" CImg ...
- PHP设置时区的方法
第一种方法:修改php.ini文件 即:date.timezone = '修改的时区名称' 对全局有效 第二种方法:date_default_timezone_set()动态设置时区,只是当前 ...
- lua(仿单继承)
--lua仿单继承 Account = { balance = } function Account:new(o) o = o or {} setmetatable(o, self)--Account ...
- 洛谷P1122 最大子树和
P1122 最大子树和 题目提供者该用户不存在 标签动态规划树形结构 难度普及/提高- 通过/提交54/100 提交该题 讨论 题解 记录 题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在 ...
- SQL查临时表没有返回数据集
问题描述:在SQL中可以查询到数据,返回不到页面上. 解决办法: set nocount on create table #list [转] 每次我们在使用查询分析器调试SQL语句的时候,通常会看到一 ...
- python系列九:python3迭代器和生成器
#!/usr/bin/python import sys '''迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退.迭代器有 ...