最近重新学习了一下KMP算法,然后重新做了自己的模板。
题目链接:
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 10010 7 #define MAXM 1000010 8 char str1[MAXN]; 9 char str2[MAXM];10 int Next[MAXN];11 12 int len1,len2;13 14 void Get_Next(){15 int j=0,k=-1;16 Next[0]=-1;17 while(j
题目链接:
1 #include2 #include 3 #include 4 using namespace std; 5 #define MAXN 100100 6 int Next_a[MAXN]; 7 int Next_b[MAXN]; 8 char str1[MAXN]; 9 char str2[MAXN];10 11 void Get_Next(char str[],int Next[]){12 Next[0]=-1;13 int j=0,k=-1,len=strlen(str);14 while(j
题目链接:
思路: 输出次数就是字符串的循环结,然后求最大最小的位置就是字符串的最小表示法了。
cxlove大神讲的很清楚:
1 #include2 #include 3 #include 4 using namespace std; 5 #define MAXN 1000100 6 int Next[MAXN]; 7 char str[MAXN]; 8 9 void Get_Next(){10 Next[0]=-1;11 int len=strlen(str),j=0,k=-1;12 while(j 0?(p2=p2+k+1):(p1=p1+k+1);44 if(p1==p2)p2++;45 k=0;46 }47 }48 return p1
题目链接:
1 #include2 #include 3 #include 4 using namespace std; 5 #define MAXN 50050 6 int Next[MAXN]; 7 char str1[MAXN]; 8 char str2[MAXN]; 9 10 void Get_Next(){11 Next[0]=-1;12 int len=strlen(str1);13 int j=0,k=-1;14 while(j 0)i=len2-len1;//这点很重要,要防止出现这种rie mmriemm情况;28 while(i
题目链接:
题意:orz..题意都理解了半天!!!
说的是给你一个26个字母表,每个字母对应的位置的字母就是明文所对应的密文,然后再给你一个字符串,字符串前部分为密文,后部分为前部分密文所对应的明文。而且密文和明文不会嵌套在一起。但是明文只显示了一部分,现在需要你补充所缺少的明文。就是先取字符串的前一半,将其转成明文后与后一半去匹配,最后返回模式串中指针的位置pos,然后原字符串中len-pos的位置就是明文开始的位置了。
1 #include2 #include 3 #include 4 using namespace std; 5 #define MAXN 100010 6 int Next[MAXN]; 7 char s[33],ss[33]; 8 char str[MAXN]; 9 char str1[MAXN];10 11 void Get_Next(){12 Next[0]=-1;13 int len=strlen(str1),j=0,k=-1;14 while(j
题目链接:
思路:这题的关键点就是要知道字符串循环节的求法(Next数组的运用),然后注意就是要取模了。
1 #include2 #include 3 #include 4 using namespace std; 5 #define MAXN 100100 6 int Next[MAXN]; 7 char str[MAXN]; 8 int len; 9 10 void Get_Next(){11 Next[0]=-1;12 int j=0,k=-1;13 while(j