您的位置:首页 > 其它

Substrings - HDU 1238(最大共同子串)

2015-08-15 17:07 369 查看
题目大意:给你N个串,求出来他们的最大公共子串的长度(子串反过来也算他们的子串)。

分析:很久以前就做过这道题,当时是用的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: