
KMP
查尔斯欢
这个作者很懒,什么都没留下…
展开
-
hdu1358 KMP
KMP题目。题目说字符串的前缀能否写成A^K的形式。对字符串求其next数组,然后线性扫描一次,如果i%(i-p[i])==0且p[i]!=0,代表两者重合部分是不重合部分的整数倍,重合部分相当于成功匹配部分,则后缀的头部分和前缀的头部分匹配成功,后缀的头部分和前缀的后部分公用一段字符串(可以为空串),后缀的后部分和前缀的后部分匹配,三者可以推出该段字符串匹配成功的长度循环次数。代码:原创 2014-04-01 11:37:02 · 635 阅读 · 0 评论 -
hdu1711 KMP
KMP最裸的题目。。。注意输入的是数字,不是字符。代码:#include #include #include using namespace std;int s1[1000001];int s2[10001];int p[10001];int n,m;void getnext(){ int j=0; for (int i=2;i<=m;i++)原创 2014-04-01 11:25:37 · 580 阅读 · 0 评论 -
hdu2087 KMP+简单动归
裸KMP+简单动态规划先用KMP求出所有匹配位置的尾节点,标记为1,然后对标记数组进行动态规划,每段成功匹配的位置有两种选择,要么取要么不取,dp[i]=max(dp[i-1],dp[i-m]+1),m为匹配串的长度。代码:#include #include #include #include using namespace std;int dp[1001];char原创 2014-04-01 21:28:47 · 650 阅读 · 0 评论 -
hdu3336 KMP
简单kmp由于next数组每次都和字符串的某一前缀进行匹配,则每次匹配成功便在前缀的位置+1,初始化所有位置为1,因为至少出现一次,最后跑一遍next,统计下结果就行了。代码:#include #include #include #include using namespace std;char s[200005];int a[200005];int p[200005原创 2014-04-03 09:25:12 · 637 阅读 · 0 评论 -
hdu3746 KMP
KMP小麻烦的题。题目让求使一个字符串可以表示成A^K模式最少需要添加多少字符,只能在头部和尾部添加。这里在头部和尾部添加效果一样,因为是最后是形成一个循环的环,那么,无论从哪个位置开始,这个环都是循环的,所以在头部和尾部添加字符效果都一样。为了解决问题,可以先求出字符串最大循环前缀,这个可以通过next数组求得,本博客前一篇文章有讲解。求出最大循环前缀之后,要判断前缀之后的串是否是前原创 2014-04-03 12:57:50 · 670 阅读 · 0 评论 -
poj2406 KMP
水题,求循环节,没什么好说的代码:#include #include #include using namespace std;int p[1000005];char s[1000005];int l;void getnext(){ for (int i=2;i<=l;i++) { int j=p[i-1]; while原创 2014-04-04 09:39:55 · 683 阅读 · 0 评论 -
hdu1867 KMP
求前缀和后缀的最长匹配长度,题目要求有点多,要求如何合并长度不等的话以原创 2014-04-04 16:30:13 · 661 阅读 · 0 评论