hdu3746(next数组解决)
来源:互联网 发布:海南软件职业技术学院 编辑:程序博客网 时间:2024/06/05 14:53
题目大意:给一个字符串,问你向尾部或首部最少加几个可以使这个字符串由n个相同的小字符串组成,且n > 1。
题目的要点:1、首尾皆可以加字符;
2、 要求最短重复子串;
3、 重复次数必须大于1;
然后就是怎么解决了。我的解决方法是next数组,举个例子吧:
字符串: a b c a b c a b c a \0
next[ ] : -1 0 0 0 1 2 3 4 5 6 7
结果是: cir = len - next[len] cir就是最短重复子串的长度
if(len%cir == 0) 那么就不用加(前提是cir != 0,也就是只重复一次的时候)
x = cir - (len%cir) 就是要添加的字符个数
其实当next数组成递增趋势上升时(要持续上升不是断断续续那种),就是第二个最短重复子串从第二个字符开始的next数组,进而我们也可以看做next数组从后面开始算重复数组,也就是它是向字符串串首加字符,然而我们也可以看出其实从首或是从尾加,答案并不变的。
下面是代码实现:
#include <iostream>#include <string>#include <cstring>#include <cstdio>using namespace std;char str[550000];int nt[550000];void get_next(){ int len = strlen(str); int i = 0, j = -1; nt[0] = -1; while(i < len) { if(j == -1 || str[i] == str[j]) nt[++i] = ++j; else j = nt[j]; } return ;}int main(){ int T; scanf("%d", &T); while(T--) { scanf("%s", str); get_next(); int len = strlen(str); int cir = len - nt[len]; if(len%cir == 0 && cir != len) printf("0\n"); else printf("%d\n", cir-(len%cir)); } return 0;}
若有错,请大家多多指教~~~
0 0
- hdu3746(next数组解决)
- hdu3746(KMP:next数组应用)
- hdu3746(KMP next数组使用)
- HDU3746 kmp算法以及next数组
- HDU3746——Simpsons’ Hidden Talents(KMP中next数组的应用)
- hdu3746 KMP的next数组应用,求项链首尾项链循环
- hdu3746 KMP深度认识next函数
- hdu3746(kmp)
- hdu3746
- hdu3746
- POJ1961(KMP-Next数组)
- HDU3746 Cyclic Nacklace(KMP)
- KMP入门级别算法详解--终于解决了(next数组详解)
- next数组
- next数组
- next数组
- next数组
- HDU 3336 一个next数组就解决了
- qt 设置窗口圆角
- 当网页加载很慢的时候,应如何分析其原因并解决问题?
- 最终实现任意个数字排序
- Linux 常用命令
- iOS苹果账号/证书/推送证书之我见
- hdu3746(next数组解决)
- VB--乘法
- Json字符串转成XML
- iOS远程推送代码分析
- 干货:结合Scikit-learn介绍几种常用的特征选择方法
- Fragment生命周期详解
- 伪静态URLRewrite学习笔记
- 将某目录文件打成tar包
- java中的函数重载和重新的区别