ural 1468
写了好久,不知道为什么不过,也不清楚到底卡在哪里。。。
只好看别人的代码,感觉除了HASH不一样外,倒没什么特别之处。同时参考那论文写的。。
http://blog.csdn.net/jyysc2010/article/details/9964513
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#define Min(a,b) (a<b?a:b)
struct node
{
int x,y;
} hash[],a1,a2;
int p=;
int n,m,f[][],ans,x1,x2,y1,y2,a[][],g[][],b[],next[],start[],tot;
long long s[]; void insert(int x,node t)//将HASH值x插入链表
{
hash[++tot]=t;
next[tot]=start[x];
start[x]=tot;
} bool cmp(int x,int l)//比较HASH值为X的相同矩阵是否出现过
{
int i,j;
for (int g=start[x]; g; g=next[g])
{
a2=hash[g];
j=l;
for (i=; i<l&&j>=l; i++)
if (f[a1.x][a1.y-i]!=f[a2.x][a2.y-i]) break;
if (i>=l)
{
if (l>ans) ans=l,x1=a1.x,y1=a1.y,x2=a2.x,y2=a2.y;
return true;
}
}
return false;
} int main()
{
int i,j,k,l,r;
char c;
scanf("%d%d%*c",&n,&m);
for (i=; i<=n; i++)
{
for (j=; j<=m; j++)
{
scanf("%c",&a[i][j]);
a[i][j]-=;
}
scanf("%*c");
}
s[]=;
for (i=; i<=n; i++) s[i]=(p*s[i-])&; r=Min(n,m);
l=;
while (l<=r)
{
k=l+r>>;
for (i=; i<=n; i++)
for (j=; j<=m; j++)
{
if (i<k) f[i][j]=f[i-][j]*p+a[i][j]&;
else f[i][j]=((f[i-][j]-a[i-k][j]*s[k-]&)+&)*p+a[i][j]&;//减去最高位,加上最低位 }//f[i][j]存下第j列第i行往上长度为k的串的HASH值
memset(start,,sizeof(start));
tot=;
for (j=; j<=m&&i>n; j++)
for (i=k; i<=n; i++)
{
if (j<k) g[i][j]=g[i][j-]*p+f[i][j]&;
else
{
g[i][j]=((g[i][j-]-f[i][j-k]*s[k-]&)+&)*p+f[i][j]&;
if (cmp(g[a1.x=i][a1.y=j],k)) break;
insert(g[i][j],a1);
}
}//g[i][j]存下右下角为第i行第j列长度为k的矩阵的HASH值
if (j<=m) l=k+;
else r=k-; }
if (ans) printf("%d\n%d %d\n%d %d\n",ans,x1-ans+,y1-ans+,x2-ans+,y2-ans+);
else printf("0\n");
return ;
}
ural 1468的更多相关文章
- BZOJ 1468: Tree
Description 真·树,问距离不大于 \(k\) 的点对个数. Sol 点分治. 同上. Code /********************************************* ...
- 后缀数组 POJ 3974 Palindrome && URAL 1297 Palindrome
题目链接 题意:求给定的字符串的最长回文子串 分析:做法是构造一个新的字符串是原字符串+反转后的原字符串(这样方便求两边回文的后缀的最长前缀),即newS = S + '$' + revS,枚举回文串 ...
- ural 2071. Juice Cocktails
2071. Juice Cocktails Time limit: 1.0 secondMemory limit: 64 MB Once n Denchiks come to the bar and ...
- ural 2073. Log Files
2073. Log Files Time limit: 1.0 secondMemory limit: 64 MB Nikolay has decided to become the best pro ...
- ural 2070. Interesting Numbers
2070. Interesting Numbers Time limit: 2.0 secondMemory limit: 64 MB Nikolay and Asya investigate int ...
- ural 2069. Hard Rock
2069. Hard Rock Time limit: 1.0 secondMemory limit: 64 MB Ilya is a frontman of the most famous rock ...
- ural 2068. Game of Nuts
2068. Game of Nuts Time limit: 1.0 secondMemory limit: 64 MB The war for Westeros is still in proces ...
- ural 2067. Friends and Berries
2067. Friends and Berries Time limit: 2.0 secondMemory limit: 64 MB There is a group of n children. ...
- ural 2066. Simple Expression
2066. Simple Expression Time limit: 1.0 secondMemory limit: 64 MB You probably know that Alex is a v ...
随机推荐
- printf的实型
参 数 说 明 %f 按实数格式输出,整数部分按实际位数输出,6位小数 %m.nf 总位数m(含小数点),其中有n位小数 %-m.nf 同上,左对齐 %0.xf 输出小数点后x位 %f 后面如 ...
- mysql中类型转换
MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值 CAST(xxx AS 类型), CONVERT(xxx,类型) 二进制,同带binary前缀的效果 : ...
- Centos7下安装python环境
前言 centos7默认是装有pyhton的. #检查python版本 [root@oldboy_python ~ ::]#python -V Python 但是众所周知,python2版本到2020 ...
- 题解报告:hdu 1213 How Many Tables
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Problem Description Today is Ignatius' birthday. ...
- T-SQL查询基础
今天来带大家了解下在sql server 中的查询机制 使用select语句进行查询 1.查询所有的数据行和列 select * from student 2.查询部分行和列 select scode ...
- C# 获得固定年月日
/// <summary> /// 获得固定年月日,时和分不固定 : 2019-01-01 00:00:00 /// </summary> /// <returns> ...
- GridView中的日期处理
数字 {0:N2} 12.36 数字 {0:N0} 13 货币 {0:c2} $12.36 货币 {0:c4} $12.3656 货币 "¥{0:N2}" ¥12.36 ...
- smtplib.SMTPDataError: (554, b'DT:SPM 126 smtp
报错信息 smtplib.SMTPDataError: (554, b'DT:SPM 126 smtp7,DsmowAA3uguL7e1cyvkyFw--.22553S3 1559096715,ple ...
- PAT_A1133#Splitting A Linked List
Source: PAT A1133 Splitting A Linked List (25 分) Description: Given a singly linked list, you are su ...
- c/c++排坑(5) -- c语言中的申明
C语言的申明总是令人头大,对于这块内容也一直让我头疼.希望通过这篇博客能够稍微梳理一下.材料和例子来源于<C专家编程> 一.C语言的申明的优先级规则 先来个例子,看看下面这行C代码到底是个 ...