kmp
文章平均质量分 64
yrleep
大学毕业不久,ios游戏自由开发者。
展开
-
poj 3461 kmp
#include #include #include using namespace std;const int maxn=1e6+9;int next[maxn];char a[maxn],b[maxn];int main(){// freopen("in.txt","r",stdin); int tcase; scanf("%d",&tcase);原创 2013-06-06 01:11:11 · 905 阅读 · 0 评论 -
poj 2406 kmp
#include #include #include using namespace std;const int maxn=1e6+9;int next[maxn];char a[maxn];int main(){ while(1) { memset(a,0,sizeof(a)); scanf("%s",a+1); i原创 2013-06-06 01:22:34 · 820 阅读 · 0 评论 -
poj 2752 Seek the Name, Seek the Fame
#include #include #include using namespace std;const int maxn=1e6+9;int next[maxn],ans[maxn];char a[maxn];int main(){ while(scanf("%s",a+1)!=EOF) { next[1]=0; int n=str原创 2013-06-06 01:40:12 · 894 阅读 · 0 评论 -
poj 2185 Milking Grid
求最小重复矩阵。 首先得证明一个结论,最小重复矩阵一定是靠着左上角的。这个可以利用黏贴技术证明。如果有一个不靠左上角的重复矩阵,必然可以通过黏贴得到一个大小相同的靠左上角的矩阵,这个自己画画就明白了。 第二个就是s=len-next[len]等于一个字符串的最小循环节。至于它是循环节利用画图可以看出来。 至于是最小的可以这么考虑,如果存在更小的原创 2013-06-06 13:57:34 · 695 阅读 · 0 评论 -
poj 1961 Period
#include #include #include using namespace std;const int maxn=1000001;char a[maxn];int next[maxn],count[maxn];int main(){ int n; int time=0; while(scanf("%d",&n),n) { s原创 2013-06-06 14:11:49 · 644 阅读 · 0 评论 -
poj 3167 Cow Patterns kmp
两个串匹配的话意思就是每一位对应的排序序号相等。即比它大比它小的数目对应相同。那么就可以用kmp来做了,匹配的时候相等的条件改成判断两个位置的数字排序位是否相等。#include #include #include using namespace std;const int maxn=1e5+9;int a[maxn],b[maxn],cnt[maxn/4][30],next原创 2013-10-03 23:41:33 · 1020 阅读 · 0 评论 -
hdu 4468 spy kmp+dp
首先可以用递推的思想来考虑,如果已经求得了dp[i]的答案,怎么得到dp[i+1]的答案。这个dp值是不考虑最后一个字符需要完整的。只需要判断所有以i+1个字符为结尾的串中有没有一个是现在的模式串的前缀,有的话证明dp[i]的值就是dp[i+1]的值。否则这个i+1号字符及它之前的还未匹配的串就一定要加入到模式串中。#include #include #include using原创 2013-11-20 21:34:38 · 1321 阅读 · 0 评论 -
hdu 4763 Theme Section kmp
这个next[i]表示的就是最长前后缀,那么头和尾的就不next就可以得出了那么就剩下判断中间是否存在了,中间的只要不重叠的那部分存在一个next[j]大于的就可以了。中间的部分是不断扩大的,那么就头尾不断next,中间不断更新新加入的节点即可。#include #include #include using namespace std;const int maxn=1e6+9原创 2013-12-06 18:59:29 · 981 阅读 · 0 评论