【kmp算法-子串暴力匹配+字符串地址传入】Blue Jeans POJ
来源:互联网 发布:计算机视觉基本算法 编辑:程序博客网 时间:2024/06/06 02:58
Think:
1知识点:kmp算法+子串暴力匹配
2题意:输入n(2<=n<=10)个字符串集合(len == 60),询问n个字符串的最长公共子串,若长度相同,则输出字典序最小的
3解题思路:通过传入字符串地址和长度枚举第一个串的子串在其它串中是否可以匹配,更新维护最优解
vjudge题目链接
以下为Accepted代码
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int max_size = 104;int _next[max_size];char st1[max_size], st[14][max_size];char link[max_size], que[max_size];void get_next(char *P, int len_P);bool kmp(char *P, int len_P, char *T, int len_T);int main(){ int T, n, i, j, k, tmp, ans; scanf("%d", &T); while(T--){ scanf("%d", &n); scanf("%s", st1); for(i = 0; i < n-1; i++) scanf("%s", st[i]); int len_P = strlen(st1); ans = 0; for(i = 0; i < len_P; i++){ for(j = i+1; j < len_P; j++){ tmp = j - i + 1; if(tmp < ans) continue; for(k = 0; k < n-1; k++){ int len_T = strlen(st[k]); if(!kmp(&st1[i], tmp, st[k], len_T)) break; } if(k != n-1) continue; if(tmp > ans){ ans = tmp; int tp = 0; for(int t = i; t <= j; t++){ link[tp++] = st1[t]; } link[tp] = '\0'; } else { int tq = 0; for(int t = i; t <= j; t++){ que[tq++] = st1[t]; } que[tq] = '\0'; if(strcmp(que, link) < 0) strcpy(link, que); } } } if(ans < 3) printf("no significant commonalities\n"); else { printf("%s\n", link); } } return 0;}void get_next(char *P, int len_P){ int q, k; _next[0] = 0; k = 0; for(q = 1; q < len_P; q++){ while(k > 0 && P[k] != P[q]){ k = _next[k-1]; } if(P[k] == P[q]) k++; _next[q] = k; } return;}bool kmp(char *P, int len_P, char *T, int len_T){ /*for(int i = 0; i < len_P; i++) printf("%c", P[i]); printf("\n");*/ int i, k; get_next(P, len_P); k = 0; for(i = 0; i < len_T; i++){ while(k > 0 && T[i] != P[k]){ k = _next[k-1]; } if(T[i] == P[k]) k++; if(k == len_P) return true; } return false;}
阅读全文
0 0
- 【kmp算法-子串暴力匹配+字符串地址传入】Blue Jeans POJ
- poj 3080 Blue Jeans(KMP匹配,枚举子串)
- poj 3080 Blue Jeans kmp 字符串匹配
- [KMP或者暴力]POJ 3080 Blue Jeans
- POJ 3080 Blue Jeans 暴力枚举+KMP
- POJ 3080 Blue Jeans KMP+暴力
- poj 3080 Blue Jeans (kmp暴力)
- POJ 3080 Blue Jeans (KMP || 暴力)
- POJ 3080 Blue Jeans kmp+暴力枚举
- poj 3080 Blue Jeans 【KMP 暴力枚举】
- POJ 3080--Blue Jeans【KMP && 暴力枚举】
- poj 3080 Blue Jeans 【kmp+暴力】
- [poj 3080]Blue Jeans[暴力枚举子串]
- poj 3080 Blue Jeans KMP模式匹配
- poj 3080 Blue Jeans (KMP+最长公共子串)
- POJ 3080 Blue Jeans(KMP 最长公共子串)
- POJ 3080 Blue Jeans(KMP 最长公共子串)
- poj 3080 Blue Jeans【KMP】【求公共子串】
- 01背包代码实现
- 拓展欧几里得(转载)
- 算法分析与设计——LeetCode Problem.3 Longest Substring Without Repeating Characters
- lr录制乱码或回放过程出错解决方法
- 【线段树】洛谷3582KIN
- 【kmp算法-子串暴力匹配+字符串地址传入】Blue Jeans POJ
- Golang regexp包中的函数和方法
- 数据库事务不同隔离级别的原理
- Hibernate中get和load方法的区别
- 然之OA添加应用
- python计算相关系数
- 用construct2做小游戏
- Construct2的艰苦经历
- 分治算法之快速排序