您的位置:首页 > 其它

POJ 2185 KMP中next数组的应用

2012-10-12 21:59 405 查看
这道题一开始没明白意思,后来一查,是说给定一个字符矩阵,然后把能够构成这个字符矩阵的最小字符矩阵的字符个数给求出来。

解法是KMP中next数组的应用,先对每一行进行get_next,求出他们的最小公倍数;再对每一列进行get_next,求出最小公倍数。这两步都很好想,然后r * c即可。

坑爹的是,我wa了5、6次都是wa在get_next(char s*)这个函数上。教训就是,以后涉及字符串处理的函数,必须避开使用指针或字符串做函数参数,否则会wa出翔的……

Code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

const int maxr = 11111;
const int maxc = 100;
int r, c;
char a[maxr][maxc], buf[maxr];
int next[maxr];

int get_next(int len)
{
next[0] = -1;
int i = 0, j = -1;
while(i < len)
{
if(j == -1 || buf[i] == buf[j])
{
i ++, j ++;
next[i] = j;
}
else
j = next[j];
}
return len - next[len];
}

int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}

int lcm(int a, int b)
{
return a / gcd(a, b) * b;
}

int main()
{
while(~scanf("%d%d", &r, &c))
{
int i, j;
for(i = 0; i < r; i ++)
scanf("%s", a[i]);
int rr = 1;
for(i = 0; i < r; i ++)
{
for(j = 0; j < c; j ++)
buf[j] = a[i][j];
rr = lcm(rr, get_next(c));
if(rr > c)
{
rr = c;
break;
}
}
int cc = 1;
for(i = 0; i < c; i ++)
{
for(j = 0; j < r; j ++)
buf[j] = a[j][i];
cc = lcm(cc, get_next(r));
if(cc > r)
{
cc = r;
break;
}
}
printf("%d\n", cc * rr);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: