字符串单元节(KMP中NEXT数组剖析)
来源:互联网 发布:mac iphone 蓝牙 网络 编辑:程序博客网 时间:2024/06/08 16:35
题目链接
上篇博客介绍了KMP算法
这次又用到了KMP算法中的NEXT数组
可以说NEXT数组的作用非常大,可以用于各种的求字符串的循环节
而这一题又如何用到了KMP中的NEXT数组
这道题求的是子循环串
正好!!和NEXT的意义相同
NEXT数组里面的数表示到此字符为止
前缀和后缀相同的长度为NEXT
这样我们拿当前的字符的序列(第一个字符是1,第二是2,依次递推)
减去NEXT 表示循环节长度,如果循环次数是整数那么就输出
如何判断循环次数是整数?如果字符的序列可以整除序列-NEXT,那么就是整数次循环
那么就输出
注意:若NEXT为0时不用考虑,NEXT为零表示没有相同的前缀后缀!那么就不存在循环!
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int nextnum[1000010];int main(){ string s; int step=1,n; while(cin>>n) { if(n==0) break; cin>>s; if(step!=1) printf("\n"); memset(nextnum,0,sizeof(0)); int i=0,j=1; while(j<n) //先写出next数组 { if(s[i]!=s[j]&&i!=0) { i=nextnum[i-1]; } else if(s[i]!=s[j]&&i==0) { nextnum[j]=0; j++; } else if(s[i]==s[j]) { nextnum[j]=i+1; i++,j++; } } for(int i=0;i<n;i++) { printf("%d ",nextnum[i]); } printf("Test case #%d\n",step++); for(int i=0;i<n;i++) { int j=i+1-nextnum[i]; if((i+1)%j==0&&nextnum[i]!=0) { printf("%d %d\n",i+1,(i+1)/j); } } } return 0;}
阅读全文
0 0
- 字符串单元节(KMP中NEXT数组剖析)
- 字符串匹配KMP算法中Next[]数组求法
- 字符串匹配KMP算法中Next[]数组求法
- 字符串匹配KMP算法中Next[]数组求法
- 字符串匹配之KMP算法(续)---还原next数组
- kmp的next数组的运用(求字符串的最小循环节)
- KMP快速字符串匹配 (next数组优化)
- KMP字符串匹配,next数组的求解
- KMP算法计算next数组 匹配字符串
- KMP算法next数组计算--字符串方式
- kmp算法对应next数组中核心while部分的剖析
- POJ1961(KMP-Next数组)
- HDOJ 1358.Period(KMP中next数组应用)
- Cyclic Nacklace (kmp中next数组的运用)
- Period(kmp中next数组的运用)
- The Minimum Length (kmp中next数组的运用)
- Power Strings (kmp中next数组的运用)
- HDU-3746 Cyclic Nacklace (活用KMP中next数组)
- android:拍照/本地上传头像+本地缓存
- 聚类
- 基于LZO算法的编解码器
- Html5 总结快捷键方式
- B. The Meeting Place Cannot Be Changed(二分)
- 字符串单元节(KMP中NEXT数组剖析)
- 作为私有命名空间的函数
- 集合:Collection API 以及List
- redis服务器相关学习笔记
- MyBatis动态SQL标签用法
- 保存上传图片的流信息
- hdu 1402 A * B Problem Plus FFT模板
- javascript初学记---3 应该是函数加点对象 (附带promise解析)
- 写一个函数实现根据下拉列表的变化,更新图片显示