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;
}
// 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;
}
相关文章推荐
- POJ 1226 Substrings(KMP+枚举)
- POJ 1226 后缀数组 或 KMP 或 暴力
- poj(1226)KMP
- POJ 1226 && HDU 1238 Substrings(kmp)
- poj 1226 求多串最长公共子串 或 回文子串 KMP&&strstr&&后缀数组
- poj1226——Substrings//KMP
- poj 1226 Substrings (string||KMP)
- poj 1226 出现或反转后出现在每个字符串中的最长子串(后缀数组/kmp)
- poj 1226|| hdu 1238 Substrings(KMP)
- POJ 1226 Substrings(最长公共连续串的变形,可以倒转+KMP)
- poj1226 Substrings (应该用kmp,但是数据弱,暴力枚举就行了)
- POJ 1226 Substrings KMP暴力 或 后缀数组
- poj1226 KMP
- poj1226之kmp入门
- poj 1226 Substrings(二分 + kmp)
- poj 1226 (字符串匹配,用KMP)
- poj kmp入门几题 mark
- KMP poj 3461
- POJ 1226(最长公共子串含逆序)
- [省选前题目整理][POJ 3461]Oulipo(KMP)