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 ...
随机推荐
- P2629 好消息,坏消息
题目描述 uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一旦老板 ...
- Asp.net 字符(一)
1.字母大小写处理 private string GetChangedStr(string oldStr, strType type) { string newStr = ""; ...
- springboot之项目打包
通过win中的cmd或者idea中终端,打包并启动项目: 1.mvn package [打包,在target中生成jar] 2.java -jar xxxxx.jar [启动jar]
- (转)关于IC设计的想法 Author :Fengzhepianzhou
一.工具的使用 工欲善其事,必先利其器.我们做IC设计的需要掌握的工具:仿真(vcs.modelsim),综合工具(dc.QS.ISE),时序分析(pt.其他的).以及后端的一些工具,比如astro. ...
- python实现: protobuf解释器
之前项目为了自动化,所以写一个protobuf的解释器,用来生成项目所需的格式. 当然现在通过以下链接的指导,跳过手工分析,直接生成代码了. https://developers.google.com ...
- Android(java)学习笔记182:多媒体之撕衣服的案例
1.撕衣服的案例逻辑: 是两者图片重叠在一起,上面我们看到的是美女穿衣服的图片,下面重叠(看不到的)是美女没有穿衣服的图片.当我们用手滑动画面,上面美女穿衣服的图片就会变成透明,这样的话下 ...
- Android Studio 中文件查询方法总结
搜索单词 Windows: Ctrl + F Mac : Cmd + F 会在当前激活的文件上查询输入的关键字,以高亮显示 跳转行 Windows: Ctrl + L Mac : Cmd + ...
- html自己写响应式布局(说起来很高大上的样子,但是其实很简单)
第一步,打开电脑中安装的Sublime Text3,新建demo文件夹用来存放文件,在里面新建一个HTML文件,通过Tab快捷键迅速创建一个HTML模板,并命名标题. 第二步,在Body标签里添加三个 ...
- easyui权限管理
在easyui上实现权限的管理 所谓权限:指的是系统中的资源,资源包括菜单资源(学习情况报表,账号审核...)以及按钮资源所谓角色:指的是系统中的权限集合(每一个角色对应着哪些权限集合) 1.一星权限 ...
- Bézier surface(贝塞尔曲面)
Bézier surface(贝赛尔曲面) 贝塞尔曲面是一种用于计算机图形学.计算机辅助设计和有限元建模的数学样条.与贝塞尔曲线一样,贝塞尔曲面由一组控制点定义.与插值在许多方面相似,一个关键的区别是 ...