【Henu ACM Round#16 F】Om Nom and Necklace
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
KMP算法可以把"i前缀"pre[i]
分成ssssst的形式
这里t是s的前缀。
然后s其实就是pre[i]中的前 i+1-f[i]个字符组成的
字符串。
特殊的,t可能就是一个空串。
比如abcdefg
这里f是kmp算法中的f数组
然后t有两种可能
① t==s
这样的话,整个前缀就是
sssssss..ss了
这里有(i)/(i-f[i])个s
设为num;
我们可以用这些s来构造ababababa的形式。
则我们需要k个ab 然后一个a
我们可以用num/k个s来构成ab,然后num%k个s来
构成一个a
我们只需要判断一下num/k是否大于等于num%k就
好了,因为ab是由num/k个s构成的,a是由num%k个s
构成的,ab的长度肯定要大于等于a的长度的
(a可以为空串,所以等于也可以)
(因此num/k-num%k个s就是b了)
用num/k个s来构成ab,可以让ab的长度尽量长一点
然后a的长度也变成尽可能地短了。
->只有num%k
这就让答案尽可能地正确了。
贪心吧。
②t!=s
这种情况其实也类似。
这不过那个t只能算成是a中的了。
因此num/k不能等于num%k了。
只能num/k>num%k
然后那个t加在num%k个s后面组成a
这样a的长度才不会超过num/k.
我写的KMP中f[i]指的是如果i失配了下一个和谁尝试匹配,也就是说s[0..f[i]-1]=s[i-1-f[i]+1..i-1] 因此n-1的循环节要i循环到n才能知道。
【代码】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6;
char s[N+10];
int f[N+10],n,k;
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
cin >> n >> k;
cin >>s;
f[0] = f[1] = 0;
for (int i = 1;i <n;i++){
int j = f[i];
while (j>0 && s[i]!=s[j]){
j = f[j];
}
f[i+1]=(s[i]==s[j]?(j+1):0);
}
for (int i = 1;i <= n;i++){
//f[i] = x
int num = i/(i-f[i]);
int ab = num/k,a = num%k;
if (i%(i-f[i])==0){
if (ab>=a){
cout<<1;
}else {
cout<<0;
}
}else{
if (ab>a){
cout<<1;
}else{
cout<<0;
}
}
}
return 0;
}
【Henu ACM Round#16 F】Om Nom and Necklace的更多相关文章
- 【Henu ACM Round#19 E】 Om Nom and Candies
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 紫书上的原题: 链接 [代码] #include <bits/stdc++.h> #define ll long lon ...
- 【Henu ACM Round#17 F】Upgrading Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1. ...
- 【Henu ACM Round #13 F】Fibonacci-ish
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举序列的头两个数字是什么 O(N^2) 然后头两个数字确定之后. f[3],f[4]..就确定了 只需查看f[3],f[4]..是 ...
- 【Henu ACM Round#15 F】Arthur and Questions
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3 ...
- 【Henu ACM Round#16 E】Paths and Trees
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 感觉很像一道最短路. 然后就试了一发. 结果真的是.. 只要用一个优先队列优化的dijkstra算法求出每个点的最短路上的前一个点是 ...
- 【Henu ACM Round#18 F】Arthur and Walls
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其 ...
- 【Henu ACM Round#20 F】 Arthur and Brackets
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. ...
- 【Henu ACM Round#19 F】Dispute
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这一题和这一题很像 (链接 ) 会发现如果a[i]!=b[i]那么就按下i就好了. 然后改变和他相邻的点. 此后a[i]再也不可能和 ...
- 【Henu ACM Round#16 D】Bear and Two Paths
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先搞一条a到b的路径 a c x3 x4 x5....xn-2 d b 然后第二个人的路径可以这样 c a x3 x4 x5...x ...
随机推荐
- (转载)PopuWindow和软键盘共存时的设置
PopuWindow和软键盘共存时的设置 收藏 artshell 发表于 2年前 阅读 1499 收藏 10 点赞 2 评论 0 腾讯云上实验室 1小时搭建人工智能应用 让技术更容易入门>> ...
- SP1487 PT07J - Query on a tree III 主席树+dfs序
Code: #include<iostream> #include<cstdio> #include<algorithm> #include<string&g ...
- NOIp2018模拟赛四十三
有了昨天的经验,不慌,开题先看source ******** 再看看题,看到C题标题: ******** 有毒... B题的“显然”50分结论推了我一个小时,然后就弃疗了... 成绩:0+50+5=5 ...
- tinymce原装插件源码分析(四)-fullscreen
fullscreen 作为一款文本编辑器,全屏功能是非常有必要的.在插件中主要是修改一些css style和触发resize事件. style问题(反例): 见github源码:https://git ...
- JDBC读写MySQL的大字段数据
JDBC读写MySQL的大字段数据 不管你是新手还是老手,大字段数据的操作常常令你感到很头痛.因为大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式 来处理的.而非一般的字段 ...
- vue-cli#2.0项目结构分析
项目结构 build 构建工具相关的目录 config 配置目录 dist 通过工具打包生成的最终需要上线的目录 node_modules 存放本地开发所有的依赖包的目录 src 源码目录 stati ...
- SVN版本号管理工具使用中常见的代码提交冲突问题的解决方法
相信刚開始学习使用SVN的小伙伴在项目合作开发的过程中一定常常遇到一些影响到自己编写的代码的苦恼.我这里列举了几种常见的问题以及问题的解决方法: 1.误删除和误操作的问题 问题1:有A和B两个人一块合 ...
- JAVA学习(五):Java面向对象编程基础
Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...
- 使用IIS承载WCF服务
作者:jiankunking 出处:http://blog.csdn.net/jiankunking 1.WCF能够方便的通过IIS承载,此承载模型与ASP.NET和ASP.NET Web Servi ...
- js控制textarea输入字符串的个数,鼠标按下抬起推断输入字符数
[Html代码] <table> <tr> <td width="150">短信内容:</td> <td> <te ...