博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4763 Theme Section ( KMP next函数应用 )
阅读量:5102 次
发布时间:2019-06-13

本文共 1572 字,大约阅读时间需要 5 分钟。

设串为str, 串长为len。

对整个串求一遍next函数,从串结尾开始顺着next函数往前找<=len/3的最长串,假设串长为ans,由于next的性质,所以找到的串肯定满足E……E这种形式,然后就是在str[ans]-str[len-2*ans]中查找是不是包含E,找到就输出,找不到就沿着next向下寻找,缩短串长。

#include 
#include
#include
#include
using namespace std;const int MAXN = 1000100;char str[MAXN];char tmp[MAXN];int nextval[MAXN];int len;void GetNextVal( char *s, int lenth ){ int i = 0, j = -1; nextval[0] = -1; while ( i < lenth ) { if ( j == -1 || s[i] == s[j] ) { ++i, ++j; if ( s[i] != s[j] ) nextval[i] = j; else nextval[i] = nextval[j]; } else j = nextval[j]; } return;}bool KMP( char *t, char *s, int lenth, int lenn ){ //GetNextVal( t, lenth ); int i = 0, j = 0; while ( j < lenn ) { if ( i == -1 || s[j] == t[i] ) { ++i, ++j; if ( i == lenth ) return true; } else i = nextval[i]; //if ( i == lenth ) return true; } return false;}int main(){ int T; scanf( "%d", &T ); while ( T-- ) { scanf( "%s", str ); len = strlen(str); GetNextVal( str, len ); int ans = nextval[len]; while ( ans > len/3 ) ans = nextval[ans]; while ( ans > 0 ) { if ( KMP( str, &str[ans], ans, len - ans - ans ) ) break; ans = nextval[ans]; } if ( ans < 0 ) printf("%d\n", len/3); else printf( "%d\n", ans ); } return 0;}

 

转载于:https://www.cnblogs.com/GBRgbr/p/3345186.html

你可能感兴趣的文章
idea 导入eclipse play1.2.7项目
查看>>
Jersey客户端API调用REST风格的Web服务
查看>>
Jetty性能调优
查看>>
Java设计模式
查看>>
Spring动态的切换数据源
查看>>
性能调优工具
查看>>
https的报文传输机制
查看>>
红黑树
查看>>
mybatis的源码学习
查看>>
leetcode(90)子集 2
查看>>
leetcode(85)最大矩形
查看>>
leetcode(121-123)买股票的最佳时机
查看>>
leetcode(105)从前序遍历和中序遍历构建二叉树
查看>>
leetcode(153)寻找旋转排序数组中的最小值
查看>>
leetcode(106)从中序遍历和后序遍历构建二叉树
查看>>
求众数leetcode(169)+投票算法
查看>>
leetcode(120)三角形最小路径之和
查看>>
html样式
查看>>
插入、删除和随机查询时间复杂度都为O(1) leetcode 381
查看>>
实战Netty集群
查看>>