写了好久,不知道为什么不过,也不清楚到底卡在哪里。。。
只好看别人的代码,感觉除了HASH不一样外,倒没什么特别之处。同时参考那论文写的。。
http://blog.csdn.net/jyysc2010/article/details/9964513
1 #include<stdio.h>
2 #include<cstring>
3 #include<cstdlib>
4 #define Min(a,b) (a<b?a:b)
5 struct node
6 {
7 int x,y;
8 } hash[250008],a1,a2;
9 int p=4877;
10 int n,m,f[505][505],ans,x1,x2,y1,y2,a[505][505],g[505][505],b[250008],next[250008],start[530000],tot;
11 long long s[505];
12
13 void insert(int x,node t)//将HASH值x插入链表
14 {
15 hash[++tot]=t;
16 next[tot]=start[x];
17 start[x]=tot;
18 }
19
20 bool cmp(int x,int l)//比较HASH值为X的相同矩阵是否出现过
21 {
22 int i,j;
23 for (int g=start[x]; g; g=next[g])
24 {
25 a2=hash[g];
26 j=l;
27 for (i=0; i<l&&j>=l; i++)
28 if (f[a1.x][a1.y-i]!=f[a2.x][a2.y-i]) break;
29 if (i>=l)
30 {
31 if (l>ans) ans=l,x1=a1.x,y1=a1.y,x2=a2.x,y2=a2.y;
32 return true;
33 }
34 }
35 return false;
36 }
37
38 int main()
39 {
40 int i,j,k,l,r;
41 char c;
42 scanf("%d%d%*c",&n,&m);
43 for (i=1; i<=n; i++)
44 {
45 for (j=1; j<=m; j++)
46 {
47 scanf("%c",&a[i][j]);
48 a[i][j]-=97;
49 }
50 scanf("%*c");
51 }
52 s[0]=1;
53 for (i=1; i<=n; i++) s[i]=(p*s[i-1])&524287;
54
55 r=Min(n,m);
56 l=1;
57 while (l<=r)
58 {
59 k=l+r>>1;
60 for (i=1; i<=n; i++)
61 for (j=1; j<=m; j++)
62 {
63 if (i<k) f[i][j]=f[i-1][j]*p+a[i][j]&524287;
64 else f[i][j]=((f[i-1][j]-a[i-k][j]*s[k-1]&524287)+524288&524287)*p+a[i][j]&524287;//减去最高位,加上最低位
65
66 }//f[i][j]存下第j列第i行往上长度为k的串的HASH值
67 memset(start,0,sizeof(start));
68 tot=0;
69 for (j=1; j<=m&&i>n; j++)
70 for (i=k; i<=n; i++)
71 {
72 if (j<k) g[i][j]=g[i][j-1]*p+f[i][j]&524287;
73 else
74 {
75 g[i][j]=((g[i][j-1]-f[i][j-k]*s[k-1]&524287)+524288&524287)*p+f[i][j]&524287;
76 if (cmp(g[a1.x=i][a1.y=j],k)) break;
77 insert(g[i][j],a1);
78 }
79 }//g[i][j]存下右下角为第i行第j列长度为k的矩阵的HASH值
80 if (j<=m) l=k+1;
81 else r=k-1;
82
83 }
84 if (ans) printf("%d\n%d %d\n%d %d\n",ans,x1-ans+1,y1-ans+1,x2-ans+1,y2-ans+1);
85 else printf("0\n");
86 return 0;
87 }
ural 1468
时间: 2024-10-20 18:35:34