HDU 1358 next数组的推移
题目大意:
输入n,再输入一个长度为n的字符串,从第二位开始,计算它的前缀(包括他自己)中出现过的重复字符串的个数,如aabaabaabaab的第6位的前缀aabaab,aab连续出现了两次,所以输出位数i=6,k=2
这个题目要利用next函数求解,不断往前推移,保证往前推移的量能被i整除。
即del=i-next[i];
保证i%del==0;
其实i%del==0成立之后不用多想了,已经可以保证前面是轮回字符串了
在此稍微进行一下理解,如next【9】=6;那么1,2,3位上的元素可以往前移3位,他们与4,5,6上的元素也是对应的。
所以count=i/del,当count>1时将其输出
因为我第一次没有理解,其实i%del==0成立之后不用多想了,已经可以保证前面是轮回字符串了这句话,所以仍然不断往前推移del位,其实是无用功,导至TLE
错误代码如下:
#include <iostream>
#include<cstring> using namespace std; int next[];
char b[];
int n,time;
void getNext(char *b)
{
next[]=,next[]=;
int j;
for(int i=;i<n;i++)
{
j=next[i];
while(j&&b[i]!=b[j]) j=next[j];
if(b[i]==b[j]) next[i+]=j+;
else next[i+]=;
}
} int Gcd(int a,int b)
{
if(b==) return a;
else return Gcd(b,a%b);
}
int main()
{
time=;
while(cin>>n&&n!=){
int t=,del,count;
for(int i=;i<n;i++) cin>>b[i]; getNext(b); cout<<"Test case #"<<time++<<endl; for(int i=;i<=n;i++){
bool judge=true;
count=;
t=next[i];
del=i-t;
while(t){
++count;
if(next[t]!=t-del){
judge=false;
break;
}
t=next[t];
}
if(judge&&count>) cout<<i<<' '<<count<<endl;
}
cout<<endl;
}
return ;
}
正确代码如下:
#include <iostream>
#include<cstring> using namespace std; int next[];
char b[];
int n,time;
void getNext(char *b)
{
next[]=,next[]=;
int j;
for(int i=;i<n;i++)
{
j=next[i];
while(j&&b[i]!=b[j]) j=next[j];
if(b[i]==b[j]) next[i+]=j+;
else next[i+]=;
}
} int Gcd(int a,int b)
{
if(b==) return a;
else return Gcd(b,a%b);
}
int main()
{
time=;
while(cin>>n&&n!=){
int t=,del;
for(int i=;i<n;i++) cin>>b[i]; getNext(b); cout<<"Test case #"<<time++<<endl; for(int i=;i<=n;i++){ t=next[i];
del=i-t;
if(i%del==&&i/del>) cout<<i<<' '<<i/del<<endl;
}
cout<<endl;
}
return ;
}
HDU 1358 next数组的推移的更多相关文章
- hdu 3948 后缀数组
The Number of Palindromes Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (J ...
- HDU 1358 Period 求前缀长度和出现次数(KMP的next数组的使用)
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 1358:Period(KMP算法,next[]数组的使用)
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU 1358字符串循环节问题 ,next数组
求字符串循环节,要求每前i个字符串前缀是否循环,有的话打印出来. 我对j=next[i]数组(未优化,从0开始,第一个为-1,)理解:字符s[i]的前面的字符串,最长的相同的前缀和后缀 的长度,因此, ...
- HDU 1358 Period(KMP next数组运用)
Period Problem Description For each prefix of a given string S with N characters (each character has ...
- hdu 1358 Period
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 思路:Next数组的用法,在第i个位置上如果有i%(i-Next[i])==0的话最小循环节就是 ...
- KMP + 求最小循环节 --- HDU 1358 Period
Period Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=1358 Mean: 给你一个字符串,让你从第二个字符开始判断当前长度 ...
- Hdu 1358 Period (KMP 求最小循环节)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目描述: 给出一个字符串S,输出S的前缀能表达成Ak的所有情况,每种情况输出前缀的结束位置和 ...
- HDU - 3948 后缀数组+Manacher
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3948 题意:给定一个字符串,求字符串本质不同的回文子串个数. 思路:主要参考该篇解题报告 先按照man ...
随机推荐
- .NET Core WebAPI Swagger使用
相对于普通的webapi而言,.net core webapi本身并不具备文档的功能,所以可以借助第三方插件:swagger,使用的话很简单. 步骤一. Nuget Packages安装,使用程序包管 ...
- asp.net 线程批量导入数据,ajax获取执行状态
最近做了一个批量导入功能,长时间运行,没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过a ...
- Asp.net MVC + Vue.js
@{ Layout = null; } <!DOCTYPE html><html> <head> <meta charset="UTF-8" ...
- 009全志R16平台tinav3.0下编译不过的问题
009全志R16平台tinav3.0下编译不过的问题 2018/11/13 11:39 版本:V1.0 开发板:SC3817R SDK:tina v3.0 1.01原始编译全志r16平台tinav3. ...
- 【HEVC简介】Inter Prediction Tools
参考文献:见<High Efficiency Video Coding (HEVC)>Inter-Picture Prediction in HEVC章节 <HEVC标准介绍.HEV ...
- MVVM没你想象的那么的好
我写过很多有关于让View Controller 更易于理解的文章,其中一种比较常见的模式就是Model-View-ViewModel(MVVM). 我认为MVVM 是一种非常容易让人混淆的 anti ...
- vscode vue template 下 style 的样式自动提示 #bug 这个搞完vue语法esLint就又不好使了,ERR
网上都是 "*.vue": "vue",改成"*.vue": "html" 就ok了 "files.ass ...
- Android Studio集成crashlytics后无法编译的问题
http://blog.csdn.net/zhuobattle/article/details/50555393 问题描述: 在用fabric集成后编译出现如下错误, Error:Cause: hos ...
- linux查看内存和释放内存
linux: 查看内存:free -m 释放内存:echo 1 > /proc/sys/vm/drop_caches
- IFE春季班第一阶段任务(请仔细阅读)
第一阶段的主要目标是帮助大家 了解.认识.学习.掌握HTML及CSS.第一阶段任务从 3月14日 开始,持续到 4月3日.当然,您也可以在这个时间以后继续自行实践练习. 第一阶段任务一共有 12 个题 ...