HDU- KMP模板题 - 1686 Oulipo - 2087 剪花布条 - 3746 Cyclic Nacklace
2014-08-22 18:42
411 查看
1686 - 78ms:
2087 - 0ms:
3746 - 109ms
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 1000000+5; long NEXT[MAXN]; char str1[MAXN],str2[MAXN]; void getNext() { int i,j; NEXT[0]=-1; for( i=1,j=-1; str1[i]!='\0'; i++ ) { while( j!=-1 && str1[i]!=str1[j+1] ) j=NEXT[j]; if( str1[i]==str1[j+1] ) j++; NEXT[i]=j; } } int kmp() { int i,j; int sum=0; for( i=0,j=-1; str2[i]!='\0'; i++ ) { while( j!=-1 && str1[j+1]!=str2[i] )j=NEXT[j]; if( str1[j+1]==str2[i] ) j++; if( str1[j+1]=='\0' )//在原串中匹配str1完毕 { sum++; j=NEXT[j];//j值回溯 } } return sum; } int main() { int t; scanf("%d",&t); getchar(); while(t--) { gets(str1); gets(str2); getNext(); printf("%d",kmp()); puts(""); } return 0; }
2087 - 0ms:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 1000000+5; long NEXT[MAXN]; char str1[MAXN],str2[MAXN]; void getNext() { int i,j; NEXT[0] = -1; for( i = 1, j = -1; str1[i]!='\0'; ++i) { while( j!=-1 && str1[i] != str1[j+1]) j= NEXT[j]; if( str1[i] == str1[j+1] )++j; NEXT[i] = j; } } int kmp() { int i,j; int sum = 0 ; for( i = 0, j = -1; str2[i]!='\0'; ++i) { while( j!=-1 && str1[j+1]!=str2[i])j = NEXT[j]; if( str1[j+1] == str2[i] )++j; if( str1[j+1] =='\0') { ++sum; j = -1; // 花条不能重叠 直接将 j 值回到 -1 从头开始匹配 } } return sum; } int main() { while( scanf("%s",str2) && str2[0] !='#' ) { scanf("%s",str1); getNext(); printf("%d",kmp()); puts(""); } return 0; }
3746 - 109ms
#include<cstdio> #include<cstring> using namespace std; const int MAXN = 100000+5; char str[MAXN]; int NEXT[MAXN]; void getNEXT() { int i,j; NEXT[0] = -1; for( i = 1 , j = -1 ; str[i]!='\0';++i ) { while( j!= -1 && str[i]!= str[j+1])j = NEXT[j]; if( str[i] == str[j+1] ) ++j; NEXT[i] = j; } } int main() { int t; scanf("%d%*c",&t); while( t-- ) { gets(str); getNEXT(); int len = strlen(str); int ring = len - NEXT[len-1] - 1; if( len%ring || ring == len ) printf("%d\n",ring-len%ring); else puts("0"); } return 0; }
相关文章推荐
- HDU - 1711 - Number Sequence,1686 - Oulipo,2087 - 剪花布条,3746 - Cyclic Nacklace (KMP基础)
- HDU - 3746 Cyclic Nacklace (KMP模板)
- [HDU 3746]Cyclic Nacklace[kmp求周期]
- HDU 3746 Cyclic Nacklace(KMP 最小循环节)
- HDU 3746 Cyclic Nacklace kmp处理字符串周期问题
- HDU 3746 Cyclic Nacklace(KMP)
- HDU 3746 Cyclic Nacklace【KMP】
- HDU 3746 Cyclic Nacklace KMP
- HDU 2087 剪花布条 && HDU 1686 Oulipo
- hdu 1686 Oulipo (KMP模板)
- HDU 3746 Cyclic Nacklace KMP的性质应用
- HDU 3746 Cyclic Nacklace KMP
- hdu 3746 Cyclic Nacklace(KMP)
- 【KMP(循环节)】hdu 3746 Cyclic Nacklace
- HDU 3746 Cyclic Nacklace(KMP:补齐循环节)
- hdu 1686(Oulipo) KMP基础题 / hdu 2087(剪花布条)KMP基本运用
- HDU--杭电--3746--Cyclic Nacklace--KMP--next值的应用
- HDU 3746 Cyclic Nacklace KMP
- HDU 3746 Cyclic Nacklace KMP
- hdu 3746 Cyclic Nacklace (KMP求最小循环节)