Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

我的天啊,这简直就是天方夜谭,我这辈子第一次遇见那么水的数据

Posted by martinakm at 2010-11-04 16:00:39 on Problem 3080
真不是我装B,这是我写的KMP算法,pi数组(也即next数组)的初始化函数cal_prefix竟然没有调用都能AC了!!!这数据真是太奇葩了。我是在后来做3450的时候,拿此题代码改了改去提交一直WA,仔细检查才检查出来的。。。

附上我原来的奇葩代码
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int pi[65];
//char s[65];
char pattern[65];
char DNA[12][65];
char ansDNA[65];
int len;
void cal_prefix(int pi[],char pattern[]){
	int k,m,q;
	pi[1] = 0;
	k = 0;
	//m = pattern.length();
    m = strlen(pattern);
	for(q=2;q<m+1;q++){
		while(k>0 && pattern[k+1-1]!=pattern[q-1]){
			k = pi[k];
		}
		if(pattern[k+1-1] == pattern[q-1]){
			k = k+1;
		}
		pi[q] = k;
	}

	return;
}

int kmpPatternMatcher(char text[],char pattern[],int pos){
	int res = -1;
	int n,m,i,q=0;
	//n = text.length(); m= pattern.length();
	n = strlen(text); m=strlen(pattern);
	//int* pi = new int[m+2];
	
	
	for(i=pos+1;i<=n;i++){

		while(q>0 && pattern[q+1-1]!=text[i-1]){
			q = pi[q];
		}
		if(pattern[q+1-1]==text[i-1]){
			q = q+1;
		}
		if(q==m){
		
			res = i-m;
			break;
			//break;
		}
	}

	//delete []pi;
	//printf("%d\n",sum);
	return res;
}
bool check(char pattern[],int m){
   int i;
   for(i=2;i<=m;i++){
      if(kmpPatternMatcher(DNA[i],pattern,0)<0){
         return false;                                       
      }               
   }
   return true;       
}
int main(int argc, char *argv[])
{ 
    int n,m,i,j,k,l;
    scanf("%d",&n);
    //printf("%d\n",n);
    while(n--){
       scanf("%d",&m);
       //printf("%d\n",m);
       for(i=1;i<=m;i++){
          scanf("%s",DNA[i]);     
       }   
       /*for(i=1;i<=m;i++){
          printf("%s\n",DNA[i]);     
       }  */ 
       len = -1;
       for(i=1;i<=60;i++){//枚举字串的长度
          for(j=0;j<=60-i;j++){//从j开始到j+i的字符串
             for(k=j,l=0;k<j+i;k++,l++){
                pattern[l]=DNA[1][k];//长度为i的字串                        
             }
             pattern[l]='\0';
             //printf("%s l=%d\n",pattern,l);

 

             //本来应该在这里cal_prefix(pi,pattern);



             if(check(pattern,m)){
                if(l>len){
                   len = l;
                   strcpy(ansDNA,pattern);       
                }else if(l==len){
                   if(strcmp(pattern,ansDNA)<0){
                      strcpy(ansDNA,pattern);                          
                   }   
                }          
             }
          }
       }
       if(len>=3){
          printf("%s\n",ansDNA);         
       }else{
          printf("no significant commonalities\n");   
       }
    }
    //system("PAUSE");
    return 1;
}


Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator