扩展KMP算法实现
来源:互联网 发布:网络熟女桃花姐 编辑:程序博客网 时间:2024/05/22 15:43
typedef long long lld;const int INF = 1000000000;const int MAX = 1000005;int a[MAX];int b[MAX];char S[MAX], T[MAX];//a[i] 为T与T(i,n)的最长公共前缀长度//b[i] 为T与S(i,n)的最长公共前缀长度void get_fail(char *S, char *T, int n, int m){int i, j = 0;a[0] = m; //第一个公共前缀长度必然为mwhile (1 + j < m && T[j] == T[1 + j])j++;a[1] = j;int k = 1; //k上一次计算的起始位置int need = 0;for (i = 2; i < m; i++){need = k + a[k] - i; //判断是否需要计算//cout << "i: " << i << " k:" <<k << " need: " << need << endl;if (a[i - k] < need)a[i] = a[i - k];else{j = 0 > need ? 0 : need;while (i + j < m && T[j] == T[j + i])j++;a[i] = j; //计算的j 为公共前缀的长度k = i;}}j = 0;while (j < n && j < m && S[j] == T[j])j++;b[0] = j;k = 0;for (i = 1; i < n; i++){need = k + b[k] - i;//k记录前面的最大位置//cout << "i: " << i << " k:" <<k << " need: " << need << endl;if (a[i - k] < need)b[i] = a[i - k];else{j = 0 > need ? 0 : need;while (i + j < n && j < m && S[i + j] == T[j])j++;b[i] = j;k = i;}}}//start 提示:自动阅卷起始唯一标识,请勿删除或增加。int main(){int n, m;int last = 0;int i, j, k;freopen("in.txt", "r", stdin);while (scanf("%s%s", &S, &T) != EOF){n = strlen(S);m = strlen(T);get_fail(S, T, n, m);//for(int i=0; i<=10; i++)//cout << a[i] << " ";//cout << endl;//for(int i=0; i<=10; i++)//cout << b[i] << " ";//cout << endl;int ans = 0;for (i = 0; i < n; i++){if (b[i] == n - i){ans = b[i];break;}}printf("%d\n", ans);}return 0;}
测试数据:
abcde cdefg
abcdab dacdacg
- 扩展KMP算法实现
- 扩展KMP算法 Extend KMP
- 扩展的KMP算法,
- 扩展KMP算法
- 扩展KMP算法
- 扩展KMP算法
- 扩展KMP算法
- KMP算法扩展
- 扩展kmp算法
- 扩展kmp算法
- 【hdu4333】扩展kmp算法
- 基础算法 扩展KMP
- 扩展kmp算法讲解
- 【算法】(扩展)KMP+manacher
- 扩展KMP算法
- 扩展kmp算法
- 扩展KMP算法
- 浅谈扩展KMP算法
- tomcat中mysq的数据池配置方法
- 在eclipse安装webshpere
- Cocos2d-x——HelloWorldScene.cpp的详解
- Extjs 分页 store处理
- RHEL6(Red Hat Enterprise Linux 6.4 )下wxGTK的卸载与安装
- 扩展KMP算法实现
- C#中sqlcommand中的用法
- dom解析一个XMl
- solaris 10安装分区
- 关于SDK 不能在线安装的问题
- 消息处理模型
- South - 在 Django 中 Migrate Database
- applicationcontext.xml里面导入别的xml的方法<import resource="/bean.xml"/>(一)
- 安装Oracle 11g R2 For Win7 旗舰版