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 |
解题报告http://hi.baidu.com/jiyanmoyu/blog/item/7fd5c3df2dd8eb1949540395.html这个的题意与2046相近,不过要求的更多,是每个前缀都要求,而且数据加大了,每个前缀都要求,自然不能一次读取求next[],只能一个字符一个字符地读,读出一个字符,对其作kmp,利用kmp不回转的特点,算法复杂度 O(n) #include<cstdio> #include<cstring> char data[1000010]; int next[1000010]; int length; void getNext(char data[],int next[]) { int i=0,j=-1; next[0]=-1; data[0]=getchar();//记得先读第一个字符,这里害我调试了好久,这里为什么要读一个字符,看了下面的++i,你就明白了 while(i<length) { if(j==-1||data[i]==data[j]) { ++i; ++j; if(i%(i-j)==0&&i/(i-j)>1)//这三行是关键,这里正好是题目要的答案 printf("%d %d\n",i,i/(i-j));// data[i]=getchar(); //继续读下一个字符 if(data[i]!=data[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; } } int main() { int testCase=0; while(scanf("%d",&length)&&length!=0) { getchar();//这个getchar()也不能少,亦害我调了好久 ++testCase; memset(data,0,sizeof(data));//这个容易理解,要使下一次的kmp生效,必须来一个null,因为null与前面所有字符均不等,故字符串的最后一个next值才是正确的 printf("Test case #%d\n",testCase); getNext(data,next); printf("\n"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator