Substrings - HDU 1238(最大共同子串)
2015-08-15 17:07
369 查看
题目大意:给你N个串,求出来他们的最大公共子串的长度(子串反过来也算他们的子串)。
分析:很久以前就做过这道题,当时是用的strstr做的,不过相同的都是枚举了子串......还是很暴力,希望下次遇到类似的题目我已经掌握高效的方法了。
==============================================================================
分析:很久以前就做过这道题,当时是用的strstr做的,不过相同的都是枚举了子串......还是很暴力,希望下次遇到类似的题目我已经掌握高效的方法了。
==============================================================================
#include<stdio.h> #include<string.h> const int MAXN = 107; const int oo = 1e9+7; const int mod = 10007; char s[MAXN][MAXN]; int next[MAXN]; void GetNext(char s[], int N) { int i=0, j=-1; next[0] = -1; while(i < N) { if(j==-1 || s[i]==s[j]) next[++i] = ++j; else j = next[j]; } } bool KMP(char a[], char b[]) { int i=0, j=0; int Na = strlen(a); int Nb = strlen(b); GetNext(b, Nb); while(i < Na) { while(j==-1 || (a[i]==b[j] && i<Na)) i++, j++; if(j == Nb)return true; j = next[j]; } return false; } bool OK(char a[], char s[]) { if(KMP(a, s) == true) return true; strrev(s); return KMP(a, s); } int main() { int T; scanf("%d", &T); while(T--) { int i, j, k, N, len=oo, ans=0; char a[MAXN];///保存最短的那个串 scanf("%d", &N); for(i=1; i<=N; i++) { scanf("%s", s[i]); int M = strlen(s[i]); if(len > M) { len = M; strcpy(a, s[i]); } } for(i=1; i<=len; i++) for(j=0; i+j<=len; j++) { char b[MAXN] = {0}; strncpy(b, a+j, i); for(k=1; k<=N; k++) { if(OK(s[k], b) == false) break; } if(k > N) j=len, ans = i; } printf("%d\n", ans); } return 0; }
相关文章推荐
- C++ ofstream和ifstream详细用法
- uva 10934 Dropping water balloons(转载)
- Activity生命周期
- Struts.xml关键元素分析(配置中的一些元素、属性理解)
- 舞台
- nginx源码分析2———基础数据结构六(ngx_hash_keys_arrays_t)
- hdu 1574 RP问题 01背包的变形
- Windows 回调监控 <二>
- Hdu_1003_Max Sum 解题心得
- 1、单例模式
- UVA 10375 - Choose and divide【唯一分解定理】
- Redis学习——环境搭建以及基础命令使用
- C# DataGridView分页显示
- linux 静态库的编译和连接过程遇到的问题
- Leetcode#43||Multiply Strings
- ImageLoader配置
- struts2的工作流程和运行原理
- mongodb 设置远程连接
- JDK7新特性<八>异步io/AIO
- hdu 4277 2012长春赛区网络赛 dfs+hashmap ***