hdu3746 KMP
2015-08-11 15:09
309 查看
这题琢磨了挺长的时间。需要理解next[]表示了什么; next[i]代表了前缀和后缀的最大匹配的值,也就是个数。
len-next[len]表示循环节的长度; 比如abcab int fl=len-next[len]=3;循环节长度为3,即cab。然后int len=strlen(s)=5;
如果len%fl==0,那就count=len/fl,不然count=len/fl+1;count表示根据长度能够循环的次数。count*fl表示能够满足循环的时候的长度,
count*fl-len就是缺少的长度。不过如果next[len]==0,也就是本身的时候,就要输出自己的len了;
len-next[len]表示循环节的长度; 比如abcab int fl=len-next[len]=3;循环节长度为3,即cab。然后int len=strlen(s)=5;
如果len%fl==0,那就count=len/fl,不然count=len/fl+1;count表示根据长度能够循环的次数。count*fl表示能够满足循环的时候的长度,
count*fl-len就是缺少的长度。不过如果next[len]==0,也就是本身的时候,就要输出自己的len了;
#include<stdio.h> #include<string.h> #define maxn 100010 char c[maxn]; int next[maxn]; void getnext() { int j,k,len=strlen(c); j=0; k=-1; next[0]=-1; while(j<len) { if(k==-1||c[j]==c[k]) { j++; k++; next[j]=k; } else k=next[k]; } } void kmp() { int i,j; getnext(); int len=strlen(c); /*for(i=0;i<=len;i++) printf("%d ",next[i]); printf("\n");*/ int fl=len-next[len];//循环节长度 int count=0; i=len; count=len/fl;//循环节的次数 if(len%fl)//如果不能整除就要+1 count++; // printf("%d %d ",fl,count); if(next[len]==0)//如果直接为0 所以就本身长度 printf("%d\n",len); else printf("%d\n",count*fl-len); } int main() { int i,j,t; scanf("%d",&t); while(t--) { scanf("%s",c); kmp(); } }
相关文章推荐
- php和Mysql使用insert on duplicate分析
- LDA中的三个散度矩阵
- Hdu 123 还是畅通工程
- (转)详细介绍java中的集合框架
- msSql分区表理解及实现
- Codeforces Round #105 (Div. 2) B. Escape
- MATLAB鼠标选取ROC区域
- LeetCode(173) Binary Search Tree Iterator
- LUA 局域网和网络
- ToolStrip类
- LoadRunner函数详解之web_reg_save_param_ex
- iOS-NSURLConnection网络请求,与服务器交互的请求注意点和实现方式
- 转:【拓扑排序详解】+【模板】
- Leetcode#11||Container With Most Water
- 黑马程序员——C语言笔记之printf函数与格式控制符
- HDOJ 4463 Outlets(最小生成树--prime)
- SQL-多实例造成***S故障
- 使用SeasLog打造PHP项目中的高性能日志组件(一)
- HDU-1010 Tempter of the Bone
- Android屏幕适配 一