在做poj2406的时候。。。按论文给的rmq模板会超内存。。。然后网上找了http://blog.csdn.net/libin56842/article/details/46310425这位大爷的da3rmq就过了= =
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stack> 5 #include <queue> 6 #include <map> 7 #include <set> 8 #include <vector> 9 #include <math.h> 10 #include <bitset> 11 #include <algorithm> 12 #include <climits> 13 using namespace std; 14 15 #define LS 2*i 16 #define RS 2*i+1 17 #define UP(i,x,y) for(i=x;i<=y;i++) 18 #define DOWN(i,x,y) for(i=x;i>=y;i--) 19 #define MEM(a,x) memset(a,x,sizeof(a)) 20 #define W(a) while(a) 21 #define gcd(a,b) __gcd(a,b) 22 #define LL long long 23 #define N 1000005 24 #define MOD 1000000007 25 #define INF 0x3f3f3f3f 26 #define EXP 1e-8 27 28 #define F(x) ((x)/3+((x)%3==1?0:tb)) 29 #define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2) 30 int wsf[N],wa[N],wb[N],wv[N],sa[N],rank[N],height[N],f[N]; 31 int s[N],a[N]; 32 char st[N],str1[N],str2[N]; 33 //sa:字典序中排第i位的起始位置在str中第sa[i] 34 //rank:就是str第i个位置的后缀是在字典序排第几 35 //height:字典序排i和i-1的后缀的最长公共前缀 36 int c0(int *r,int a,int b) 37 { 38 return r[a]==r[b]&&r[a+1]==r[b+1]&&r[a+2]==r[b+2]; 39 } 40 int c12(int k,int *r,int a,int b) 41 { 42 if(k==2) return r[a]<r[b]||r[a]==r[b]&&c12(1,r,a+1,b+1); 43 else return r[a]<r[b]||r[a]==r[b]&&wv[a+1]<wv[b+1]; 44 } 45 void sort(int *r,int *a,int *b,int n,int m) 46 { 47 int i; 48 for(i=0; i<n; i++) wv[i]=r[a[i]]; 49 for(i=0; i<m; i++) wsf[i]=0; 50 for(i=0; i<n; i++) wsf[wv[i]]++; 51 for(i=1; i<m; i++) wsf[i]+=wsf[i-1]; 52 for(i=n-1; i>=0; i--) b[--wsf[wv[i]]]=a[i]; 53 return; 54 } 55 void dc3(int *r,int *sa,int n,int m) 56 { 57 int i,j,*rn=r+n,*san=sa+n,ta=0,tb=(n+1)/3,tbc=0,p; 58 r[n]=r[n+1]=0; 59 for(i=0; i<n; i++) if(i%3!=0) wa[tbc++]=i; 60 sort(r+2,wa,wb,tbc,m); 61 sort(r+1,wb,wa,tbc,m); 62 sort(r,wa,wb,tbc,m); 63 for(p=1,rn[F(wb[0])]=0,i=1; i<tbc; i++) 64 rn[F(wb[i])]=c0(r,wb[i-1],wb[i])?p-1:p++; 65 if(p<tbc) dc3(rn,san,tbc,p); 66 else for(i=0; i<tbc; i++) san[rn[i]]=i; 67 for(i=0; i<tbc; i++) if(san[i]<tb) wb[ta++]=san[i]*3; 68 if(n%3==1) wb[ta++]=n-1; 69 sort(r,wb,wa,ta,m); 70 for(i=0; i<tbc; i++) wv[wb[i]=G(san[i])]=i; 71 for(i=0,j=0,p=0; i<ta && j<tbc; p++) 72 sa[p]=c12(wb[j]%3,r,wa[i],wb[j])?wa[i++]:wb[j++]; 73 for(; i<ta; p++) sa[p]=wa[i++]; 74 for(; j<tbc; p++) sa[p]=wb[j++]; 75 return; 76 } 77 void getheight(int *r,int n)//n不保存最后的0 78 { 79 int i,j,k=0; 80 for(i=1; i<=n; i++) rank[sa[i]]=i; 81 for(i=0; i<n; i++) 82 { 83 if(k) 84 k--; 85 else 86 k=0; 87 j=sa[rank[i]-1]; 88 while(r[i+k]==r[j+k]) 89 k++; 90 height[rank[i]]=k; 91 } 92 } 93 94 int rm[N]; 95 96 void RMQ(int n) 97 { 98 int k = rank[0]; 99 rm[k] = N; 100 int i; 101 DOWN(i,k-1,0) 102 { 103 if(height[i+1]<rm[i+1]) rm[i]=height[i+1]; 104 else rm[i]=rm[i+1]; 105 } 106 UP(i,k+1,n) 107 { 108 if(height[i]<rm[i-1]) rm[i]=height[i]; 109 else rm[i]=rm[i-1]; 110 } 111 } 112 int solve(int n) 113 { 114 int i; 115 for(int i=1;i<=n/2;i++) 116 { 117 if(n%i) continue; 118 if(rm[rank[i]]==n-i) return n/i; 119 } 120 return 1; 121 } 122 int main() 123 { 124 while(1) 125 { 126 scanf(" %s",st); 127 int len=strlen(st),n,ans; 128 n=len; 129 if(len==1&&st[0]=='.') 130 break; 131 if(!len) 132 { 133 printf("0\n"); 134 continue; 135 } 136 for(int i=0;i<len;i++) 137 s[i]=st[i]; 138 s[n]=0; 139 dc3(s,sa,len+1,300); 140 getheight(s,len); 141 RMQ(len); 142 printf("%d\n",solve(len)); 143 } 144 return 0; 145 }