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 ...
随机推荐
- RHEL 7.2 源码安装Python 3.6.2报错
报错代码:zipimport.ZipImportError: can't decompress data; zlib not available 一条命令解决:yum install zlib-dev ...
- PowerShell~执行策略的介绍
首先看一下无法加载ps1脚本的解决方法 事实上也是由于策略导致的 解决方法主是开启对应的策略 set-ExecutionPolicy RemoteSigned 执行策略更改 执行策略可以防止您执行不 ...
- mac及windows下安装ss实现***
官网下载shadowsock(mac/windows都是下面地址,页面会根据当前系统自动判断所下载的包) https://sourceforge.net/projects/shadowsocksgui ...
- IOS数组
/*******************************************************************************************NSArray ...
- Selenium私房菜系列3 -- Selenium API参考手册【ZZ】
大家在编写测试案例想查阅Selenium API说明时,可以查阅本文,否则请跳过! (注:这里API版本比较老,新版本的Selenium的API在这里不一定能找到.) Selenium API说明文档 ...
- 微信小程序开发系列六:微信框架API的调用
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...
- HashSet LinkedHashSet TreeSet 分析
1.HashSet分析 hashset 底层是hash表,就是hashMap,是无序的,唯一的.也就是说,它的底层其实就是一个HashMap key 值的组成值.所以具有唯一性. public Ha ...
- core 中使用 nlog
引包 代码 public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory logFac) ...
- Chrome浏览器安装React developer tools
1. 到 https://github.com/facebook/react-devtools 下载 react-devtools 2. 进入 react-devtools 目录 运行命令 npm ...
- vue+Java 前后端分离,多次请求Session不一致的问题(网络上找的)
在vue main.js中增加以下配置: import axios from 'axios'; axios.defaults.withCredentials=true; 请求时:设置 withCred ...