Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
应该算是暴力求解的,但是过了我的算法就是先找出字符串的长度n,然后求n的所有因数。因为题目中那个字符串a的长度只可能是n的因数。然后就是遍历所有可能的长度,依次去匹配。每一趟匹配的时间复杂度都是O(n),因为最坏情况下都要走完整个字符串。前面求因数的部分是O(根号n),再加上对因数大小排序O(根号n*logn)。 最后整体的时间复杂度应该是O(n的因数个数*n)。n的因数个数是个什么级别这个就不清楚了,但是肯定超不过O(n^2)的。但如果真的达到了n^2,应该会超时吧。 附上代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define N 1000000 void q_sort(int*a,int s,int t) { int i,j,tmp; if(s<t) { while(1) { i = s+1; j = t; while(i<=t && a[i]<=a[s]) //从左边起,寻找大于分界元素的元素 i++; while(j>s && a[j]>=a[s]) //从右边起,寻找小于分界元素的元素 j--; if(i>=j) break; //交换a[i]和a[j] tmp = a[i]; a[i] = a[j]; a[j] = tmp; } if(j!=s) //交换a[j]和a[s] { tmp = a[s]; a[s] = a[j]; a[j] = tmp; } q_sort(a,s,j-1); q_sort(a,j+1,t); } } int cmp(char*a,int s1,int t1,char*b,int s2,int t2) //匹配成功,返回1;否则,返回0。 { int i,j; int flag; i = s1; j = s2; if((t1-s1)!=(t2-s2)) return 0; flag = 1; while(i<=t1 && j<=t2) { if(a[i]==b[j]) { i++; j++; } else { flag = 0; break; } } return flag; } int main() { char s[N+1]; int i,j,n,m; int a[1000]; //存储n的约数 int top; int flag; gets(s); while(strcmp(s,".")!=0) { n = strlen(s); //计算n的所有因数 m = sqrt(n); top = 0; for(i=1;i<m;i++) { if(n%i==0) { a[top++] = i; a[top++] = n/i; } } if(m*m==n) a[top++] = m; else if(n%m==0) { a[top++] = m; a[top++] = n/m; } //对因数进行排序 q_sort(a,0,top-1); //匹配 for(i=0;i<top;i++) //遍历所有可能的长度 { m = n - a[i] + 1; flag = 1; //假设找到了 for(j=a[i];j<m;j+=a[i]) //进行匹配 { if(cmp(s,0,a[i]-1,s,j,j+a[i]-1)) continue; else { flag = 0; break; } } if(flag) { printf("%d\n",n/a[i]); break; } } gets(s); } return 0; } 没有给测试样例,因为我测了题目中的那三组就提交了,然后就过了。 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator