首页 > 代码库 > URAL 1486(二维字符串hash)

URAL 1486(二维字符串hash)

题意:一个最大500*500的字符矩阵,求最大的两个相同的字符正方形。正方形可以有重叠部分但不能重合。


解法:首先是二分正方形的长度,然后判断某个长度存在时候计算字符矩阵的二维hash值,二维hash的方法是:


这样子拓展的hash算法可以O(1) 获取任意一个子矩阵的hash值。


代码:

/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef unsigned long long LL;
const int Max=502;
const LL INF=100007;

char s[Max][Max];
LL hash[Max][Max];
LL hash2[Max][Max];
LL scale[Max];
LL scale2[Max];
LL seed=3131;
LL seed2=1313;
int n,m;
int count1=0;
struct edge
{
    LL data;
    int next;
    int x,y;
} edges[Max*Max];

int head[100010];
int tot=0;
void add(LL u,LL data,int x,int y)
{
    edges[tot].data=http://www.mamicode.com/data;>

URAL 1486(二维字符串hash)