首页 > 代码库 > ural 1468

ural 1468

写了好久,不知道为什么不过,也不清楚到底卡在哪里。。。

只好看别人的代码,感觉除了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 }
View Code