51NOD欧姆诺姆和项链——KMP算法(非水题)


思路:好久不见,今天要开始真正写题了。这个题之前我的理解有点问题,导致写了很久最终都是一直都只能过样例。需要注意的是输出中每一个“1”都是和别的输出相互独立的,比如输入以下样例
输入样例: abababab
输出样例:
在输出字符串当中每一个“1”都代表原字符串中该位置以前包括该位置的字符都是满足题目要求的ABAB或ABABA类型。
刚开始没有理解好以上,导致我错误的理解是既然都能找到既然都是ABABA类型了,那肯定也是前缀也是ABAB,那我只需要找前缀为ABAB类型的就行啊。所以,而且我之前的输出一直都是前面一直为0后段一直为1。所以说样例也是有点坑,完全符合我了错误的思路。
写给自己看的
以下内容参照了这里 》》LuYouQi233《《
这里用到了KMP算法当中的next数组,我们用S来表示一个循环节(比如字符串abababab中,ab是一个循环节S),在next数组中的值除了表示最长相等前后缀以外,在这个题目中还能表示有多少个AB;当有空字符串的时候我们用ABAB来代表这个字符串,否则用ABABA。
num = (i+1)/(i-next[i])表示当前字符串中有多少个AB;num/k 表示当前AB中有多少个S;num%k 表示当前的A中有多少个S;
1)当(i+1)%(i-next[i])==0时,既当前字符串的类型是ABAB型;所以num/k大于等于num%k既满足条件输出1;
2)当(i+1)%(i-next[i])!=0时。既当前的字符串类型是ABABA型;所以需要num/k大于num%k既满足条件输出1;
那么问题来了,为什么一个是大于等于一个是等于呢??因为第一种情况是B可能是空的,而第二种情况A或B都不能为空。
#include<cstdio>
#include<iostream>
using namespace std;
int nextt[];
char s[];
void cal_next(char str[],int len)
{
nextt[] = -;
int k = -;
for (int i = ; i < len; i++){
while (k > - && str[k + ] != str[i])
k = nextt[k]; if (str[k + ] == str[i])
k += ; nextt[i] = k;
}
}
int main()
{
int n, k; cin >> n >> k;
getchar();
for (int i = ; i < n; i++){
s[i] = getchar();
}
cal_next(s, n); for (int i = ; i < n; i++){
int num = (i + ) / (i - nextt[i]);
if ((i+) % (i - nextt[i])==){
if (num / k >= num%k)
cout << "";
else cout << "";
}else{
if (num / k > num%k)
cout << "";
else cout << "";
}
} return ;
}
51NOD欧姆诺姆和项链——KMP算法(非水题)的更多相关文章
- 51Nod 1554 欧姆诺姆和项链 (KMP)
题意:中文题. 析:首先要使用KMP的失配函数 f ,对于长度为 i 的串,如果存在循环节那么 i % (i-f[i]) == 0,循环节的长度就是 i - f[i] ,当然次数就是 i / (i- ...
- 51nod 1554:欧姆诺姆和项链——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1554 题目: 有一天,欧姆诺姆发现了一串长度为n的宝石串,上面有五颜六色 ...
- 51nod 1554 欧姆诺姆和项链
有一天,欧姆诺姆发现了一串长度为n的宝石串,上面有五颜六色的宝石.他决定摘取前面若干个宝石来做成一个漂亮的项链. 他对漂亮的项链是这样定义的,现在有一条项链S,当S=A+B+A+B+A+...+A+B ...
- 51NOD 1554 欧姆诺姆和项链 巧妙利用KMP
请戳这里! #include<cstdio> #define N 1000100 char s[N]; int n,k,nxt[N],ans[N]; int main() { scanf( ...
- [codeforces] 526D [51nod] 1554 欧姆诺姆和项链
原题 KMP 方法一: 听说是ex-kmp--来自学姐 ex-kmp是处理两个串s和t之间,t的每一个后缀在s中的最长前缀的长度的一个算法. 它很像manacher(至少我和学姐这么认为),记录了一个 ...
- 51nod 1548 欧姆诺姆和糖果 (制约关系优化枚举)
1548 欧姆诺姆和糖果 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 一天,欧姆诺诺姆来到了朋友家里,他发现了 ...
- 51nod——1548 欧姆诺姆和糖果
一开始以为是贪心,然后发现没法贪.暴力枚举肯定T,于是用约束关系优化: 假设wr >= wb, 第一种情况:wr >= sqrt (c), 则此时最多吃c / wr个r,且c / wr & ...
- 51nod1548 欧姆诺姆和糖果
思路: 只有兩種糖果,枚舉其中一種糖果的數量就可以得到一個可行解: 但總有一種糖果的數量是較少的,並且該數量小於sqrt(C): 簡單證明: 1.若有任一糖果的質量大於sqrt(C),則必定有一糖果的 ...
- 【BZOJ3781、2038】莫队算法2水题
[BZOJ3781]小B的询问 题意:有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数 ...
随机推荐
- 关于js-cookie使用出现兼容性问题以及js-cookie的如何使用
最近使用vue开发的项目,开发过程引入了js-cookie插件,在PC端以及移动端网页调试都没出现问题,但是打包成APP在安卓手机调试发现使用js-cookie保存的数据失效了,然后只能使用local ...
- mysql/sql server和java之间的数据类型对应关系
Mysql************************************当前列 ClassName ColumnType DisplaySize TypeName0: java.lang.I ...
- 聪明的质监员 2011年NOIP全国联赛提高组(二分+前缀和)
聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员, ...
- bzoj1085骑士精神(搜索)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1893 Solved: 1051 Description ...
- golang——strconv包常用函数
1.func ParseBool(str string) (value bool, err error) 返回字符串表示的bool值.它接受1.0.t.f.T.F.true.false.True.Fa ...
- ACM_区间调度问题(贪心)
Meetings 系列一 Time Limit: 2000/1000ms (Java/Others) Problem Description: 多年之后的广财ACM编协如日中天,下系多个部门,且编协成 ...
- Required diagnostic data collection for RMAN backup
1. Provide the alert.log and related tracefile of the target database. 2. Provide details on the l ...
- 全面学习ORACLE Scheduler特性(12)使用Windows和Window Groups
七.使用Windows 此Windows非彼Windows,通常说的Windows是指盖首富的操作系统,而此处所说的Windows,是指SCHEDULER特性中的一个子项.在SCHEDULER中,WI ...
- [转]Mysql之Union用法
转自:http://blog.csdn.net/ganpengjin1/article/details/9090405 MYSQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链 ...
- Java 遍历Map对象的4种方法
http://blog.csdn.net/tjcyjd/article/details/11111401