hdoj 1711(kmp算法)(数字不是字符串)
2012-02-29 13:33
204 查看
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> using namespace std; #define MAX 1000005 //#define MAX 200 int boss[MAX],pattern[MAX]; int bossleng;int patternleng; //next表明的是字符串覆盖自己的性质也就是k值(也就是说next[j]=k)(j跟我写的文章中不太一样啊。) //我们要算next[6]的值,有关的为P本身前6个字符010010 。(这个就是例子) //此字符串中010 = 010左右相同的最大字符串为010,个数为3。所以next[i]=3; int next[MAX]; int max(int a,int b) { if(a>b) return a; return b; } void getnext() { //初始化为0 memset(next,0,sizeof(next)); int i=-1,j=0;//i=-1的时候是为了下面的i++ next[0]=-1;//第一个肯定是-1 while(j<patternleng) { if(i==-1||pattern[i]==pattern[j]) { i++; j++; next[j]=i; } else i=next[i]; } } //获取的是开始匹配的位置 //其实文章中跟论文中有一点出入 //因为annb和anna比较的时候,后来移动的时候j=3,也就是从不匹配的那一位算的。 int KMP() { int i=0,j=0,len1=bossleng,len2=patternleng; //文章中所说的跳过,是没有比较的操作 while((i<len1)&&(j<len2)) { //j==-1表示没有一个相同的。i表示匹配到的字符串(母串),j表示的是开始比较是否匹配的字符串(模式串) //当j==-1的时候需要i++,j++(),因为这个表示从第0个元素开始重新匹配。+1以后的值为0,才开始判断。 //如果相同的话,也就是继续匹配下一个 if(j==-1||boss[i]==pattern[j]) { j++;i++; } //如果不相同的话,移动。 else j=next[j];//取出next[j] } //len2是模式串的长度,j是模式串的指针,也就是说如果说完全匹配,返回的是开始的位置 if(j==len2) return i-len2+1; //如果不匹配,返回-1 else return -1; } //获取的是匹配的长度 int index_KMP() { int i=0,j=0,len1=bossleng,len2=patternleng,re=0; while(i<len1&&j<len2) { if(j==-1||boss[i]==pattern[j]) {i++;j++;} else j=next[j]; re=max(re,j); } return re; } int main() { //freopen("in.txt","r",stdin); int casen;scanf("%d",&casen); while(casen--) { scanf("%d %d",&bossleng,&patternleng); int i,j; for(i=0;i<bossleng;i++) { scanf("%d",&boss[i]); } for(j=0;j<patternleng;j++) { scanf("%d",&pattern[j]); } getnext(); printf("%d\n",KMP()); } return 0; } //在那个表格当中i相当于最上面的一行。
相关文章推荐
- ORDER BY TO_NUMBER(S.STOCK_CODE) 当S.STOCK_CODE不是数字字符串时会报错的处理
- •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
- 为什么R.string.ID 返回的是一串数字,而不是字符串?
- 2.•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
- hdoj 3336 Count the string【kmp算法求前缀在原字符串中出现总次数】
- ACM--数字个数--HDOJ 2017--字符串统计
- •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
- parseInt是用于字符串,而不是用于数字
- HDOJ1106 排序(字符串数字提取)
- 我的java之路——按照电话机表盘数字与字符的对应关系(这里用数字1而不是0代表空格),用数字串匹配字符串
- 字符串_KMP算法(求next[]模板 hdu 1711)
- js 字符串整数字 加 上数字 ,而不是字符串拼接
- sql server中有不是全数字的字符串
- hdoj 1711 Number Sequence【kmp(数字数组)】
- js 去掉字符串里面所有的逗号\以及判断不是数字
- 判断字符串是否为纯数字,如果不是则去除非数字字符
- 用VBA截取excel中【第一个字符到倒数第一个不是数字或字母的字符串】
- 如何判断一个变量是否是数字而不是字符串
- Java判断字符串是否为纯数字,如果不是则报错的GUI
- jsp 获取两个数值直接用大于、小于比较大小和算加法,不是按数字大小比较,JSP都是以字符串在操作