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)表示数 ...
随机推荐
- POJ1389 Area of Simple Polygons 线段树
POJ1389 给定n个整数点矩形,求面积并. 显然ans必然是整数. 记录若干个事件,每个矩形的左边的竖边记为开始,右边的竖边记为结束. 进行坐标离散化后用线段树维护每个竖的区间, 就可以快速积分了 ...
- vs2017 + miniUI 后端框架使用
vs2017 + miniUI 后端框架使用 上miniUI官网直接下载框架.http://www.miniui.com/ 此框架使用说明很清楚. 2.1.vs2017创建安装miniUI后端框架 ...
- SQL 设置登录名和密码
1.打开SQL Server Manager管理器,在左面找到 ‘安全性’ 单击右键 选择‘新建”->“登录”, 如下图 2.弹出对话框,在登录名中输入你的登录号,选择'SQLSERVER身份验 ...
- 【js】再谈移动端的模态框实现
移动端模态框的机制因为与PC的模态框机制一直有所区别,一直是许多新人很容易踩坑的地方,最近笔者作为一条老咸鱼也踩进了一个新坑中,真是平日里代码读得太粗略,故而写上几笔,以儆效尤. 故事的起因是这样的, ...
- Linux上安装wine qq的方法
linxu上安装QQ的发 百度网盘 提取码:f2sn 步骤一.安装wine(详见:https://www.winehq.org/download) // ubuntu/ubuntukylin/mint ...
- EditText(5)如何控制输入键盘的显示方式及参数表
参考: https://developer.android.com/training/keyboard-input/visibility.html 1,进入Activity时,EditText就获得焦 ...
- 块级标签与预格式化文本标签----------大多数XHTML可以表示为两种类型的标签:块标签(block tag)和内联标签(inline tag)
<html> <head> <meta charset="utf-8"> <title>块级标签</title> < ...
- D. Fedor and coupons 二分暴力
http://codeforces.com/contest/754/problem/D 给出n条线段,选出k条,使得他们的公共部分长度最大. 公共部分的长度,可以二分出来,为val.那么怎么判断有k条 ...
- C# 代码笔记_文件
string Route = @"D:\ksy\ksy\WebSite1\";//文件地址 string File_name = "user ...
- 6.13---shiro