您的位置:首页 > 其它

POJ_1226_KMP

2010-04-23 10:48 190 查看
//============================================================================

// Name : POJ_1226.cpp

// Author : tiger

// Version :

// Copyright : Your copyright notice

// Description : Hello World in C++, Ansi-style

//============================================================================

#include <iostream>

using namespace std;

char s[102][102];

int next[102],n;

int getnext(int *next,char *s,int len)

{

next[0] = 0;

next[1] = 0;

int i,j;

for(i = 1,j=0 ; i <len; )

{

if(j == 0 || s[i] == s[j])

{

i++;

j++;

next[i] = j;

}

else

{

j = next[j];

}

}

return 0;

}

bool KMP(char *s1,char *s2)

{

int len1 = strlen(s1)-1;

int len2 = strlen(s2)-1;

getnext(next,s1,len1);

int i,j;

for(j = 1,i = 1; i <=len2 && j <= len1;)

{

if(j ==0 || s1[j] == s2[i])

{

i++;

j++;

}

else

{

j = next[j];

}

}

if(j>len1)

return true;

return false;

}

int sovel(int min_i,int min_len)

{

int i,j,k;

int flag;

char temp1[102];

char temp2[102];

int max = 0;

for(i = 1; i <= min_len; i++)

{

for(j = min_len - i +1; j > 0; j--)

{

flag = 0;

strncpy(temp1+1,s[min_i]+i,j);

temp1[j+1] = 0;

for(k = j; k>0;k--)

temp2[j-k+1] = temp1[k];

temp2[j+1] = 0;

for(k = 0; k < n; k++)

{

if(k == min_i)

continue;

if(KMP(temp1,&s[k][0]) || KMP(temp2,&s[k][0]) )

{

flag ++;

}else

{

break;

}

}

if(flag == n-1 && j > max)

max = j;

}

}

return max;

}

int main() {

freopen("in","r",stdin);

int t,i;

scanf("%d",&t);

int min_len,min_i,len;

while(t--)

{

scanf("%d",&n);

min_len = 101;

for(i =0; i < n; i++ )

{

scanf("%s",s[i]+1);

len = strlen(s[i]+1);

s[i][0] = '1';

if( len <= min_len)

{

min_len = len;

min_i = i;

}

}

printf("%d/n",sovel(min_i,min_len) );

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: