法一解释:转自http://www.cnblogs.com/yjiyjige/p/3263858.html

关键运算步骤


i 0 1 2 3 4 5 6 7 8 9
A B A C D A B A B C
a -1 0 0 1 0 0 1 2 3 2
s[1]!=s[a=0] -> a=next[a=0]=-1 -> next[++1]=++a=0;
s[2]==s[a=0] -> next[++2]=++a=1;
s[3]!=s[a=1] -> a=next[a=1]=0 -> s[3]!=s[a=0] -> a=-1 ->s[4]=0;
s[8]!=s[a=3] -> a=next[a=3]=1 -> s[8]==s[a=1] -> s[++8]=s[9]=++a=2;
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int next1[111111];
char s[]="ABACDABABA";//"ABABCABAA";
void getnext()
{
int i=0,a=-1;//i代表字符的下标,a代表失配时下一步要移动的位置
next1[0]=-1;
while(i<strlen(s))
{
if(a==-1||s[i]==s[a])//
next1[++i]=++a;
else
a=next1[a];
}
for(int k=0;k<i;k++)
{
printf("%d\n",next1[k]);
}
}
int main()
{
getnext();
return 0;
}

法二:运用最大长度表

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int next[111111];
void next1(char s[],int next[],int n)
{
next[0]=0;
int len=0,i=1;//len表示前缀长度
while(i<n)
{
if(s[i]==s[len])//第i个等于第len个
{
len++;
next[i]=len;
i++;
}
else
{
if(len>0)
len=next[len-1];
else//也就是len=0的情况
{
next[i]=len;//0
i++;
}
}
}
for(int i=n;i>0;i--)//值右移一位
next[i]=next[i-1];
next[0]=-1;
}
int main()
{
char s[]="ABABCABAA";
int p[9];
next1(s,p,9);
for(int i=0;i<9;i++)
{
printf("%d\n",p[i]);
}
return 0;
}

求next数组的两种方法的更多相关文章

  1. python将两个数组合并成一个数组的两种方法的代码

    内容过程中,把写内容过程中常用的内容收藏起来,下面的资料是关于python将两个数组合并成一个数组的两种方法的内容,希望能对小伙伴们有帮助. c1 = ["Red","G ...

  2. java script 数组去重两种方法

    第一种方法: var arr=[1,1,2,3,4,4,4,5,6,6,6,6];    var arrb=Array();    for(var i=0;i<arr.length;i++)   ...

  3. python遍历数组的两种方法

    第一种,最常用的,通过for in遍历数组 1 2 3 4 5 6 7 8 colours = ["red","green","blue"] ...

  4. [Arduino] 逗号分隔文本到数组的两种方法

    以下是今日练习通过逗号来分割字符数组/字符串的2个例子和方法" 1.通过indexOf函数 /* *Splitsplit sketch *split a comma-separated st ...

  5. nodejs 遍历数组的两种方法

    var array = [1,2,3]; array.forEach(function(v,i,a){ console.log(v); console.log(i); console.log(a); ...

  6. js数组创建两种方法

    一.数组直接量形式创建数组 var arr=[];//空数组 ,,,,,]; ,,,],{x:,y:}]; ; ,x+,x+]; console.log(arr3); //[1,3,3,4] ,,]; ...

  7. javascript遍历数组的两种方法

    var array=new Array(); array [0]="北京"; array [1]="天津"; ...//solution 1 for(var i ...

  8. PHP中数组合并的两种方法及区别介绍

    PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = ...

  9. php获取数组中重复数据的两种方法

    分享下php获取数组中重复数据的两种方法. 1,利用php提供的函数,array_unique和array_diff_assoc来实现 <?php function FetchRepeatMem ...

随机推荐

  1. idea出现乱码问题

    Intellij Idea打包工程时控制台显示乱码 这主要是maven编译时编码问题导致的.在Intellij的settings中maven的run配置中设置它的VM Options为-Darchet ...

  2. CentOS下安装zookeeper并设置开机自启动

    转自: 一.安装zookeeper # cd /opt/ # mkdir zookeeper # cd zookeeper/ # tar -zxvf zookeeper-3.4.6.tar.gz # ...

  3. Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包

    一,实例:新建了一个Maven项目,在eclipse中通过 build path –> configure path-.将依赖包添加到工程中后,eclipse不报错了.但是用Maven命令 mv ...

  4. luogu P3760 [TJOI2017]异或和

    传送门 对于每个二进制位考虑有多少区间和这一位上为1 从前往后扫每个前缀和,如果当前这个前缀和某一个二进制位上为1,因为区间和由这个前缀和减去前面的前缀和得来,如果减去了这一位为0的前缀和,那么 减去 ...

  5. POJ1113 Wall【凸包】

    题意: 求把城堡围起来需要的最小墙壁周长. 思路: 围墙周长为=n条平行于凸包的线段+n条圆弧的长度=凸包周长+围墙离城堡距离L为半径的圆周长. 代码: ...还是看大佬写的,自己做个记录方便日后复习 ...

  6. DjangoAdmin自定义过滤器

    class UserIDFilter(admin.SimpleListFilter): # 自定义用户查询过滤器 title = _('关联用户') parameter_name = 'user_id ...

  7. 交换机console口连接

    http://www.webkaka.com/info/archives/knowledge/2010/08/30452/

  8. Android勒索软件研究报告

    Android勒索软件研究报告 Author:360移动安全团队 0x00 摘要 手机勒索软件是一种通过锁住用户移动设备,使用户无法正常使用设备,并以此胁迫用户支付解锁费用的恶意软件.其表现为手机触摸 ...

  9. Django开发笔记五

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.页面继承 定义base.html: <!DOC ...

  10. 【逆向工具】IDA使用4-控制台逆向分析 Reverse004.exe 获取密码

    工具 吾爱破解版本OD.IDA6.8 OD使用-动态分析 OD快捷方式 F2 下断点,也就是指定断点的地址F3加载一个可执行程序,进行调试分析F4程序执行到光标处 F5 缩小.还原当前窗口 F7 单步 ...