poj3080 kmp+枚举

来源:互联网 发布:自动分析软件 编辑:程序博客网 时间:2024/05/22 15:37

kmp算法+枚举 0ms

注意字典序输出,因为这个原因wrong了一次。

代码:

#include <iostream>using namespace std;#define LEN 60int next[LEN];char dna[11][LEN];void get_next( char *a, int len ){int i,temp;    memset(next,0,sizeof(next));for( i = 1; i < len; i++ ){temp = next[i-1];while( temp && a[i] != a[temp] )temp = next[temp-1];if( a[i] == a[temp] )next[i] = temp+1;}}bool check( char *a, int len, int size ){int i,j,k;get_next(a,len);for( k = 1; k < size; k++ ){j = 0;for( i = 0; i < LEN; i++ ){while( j > 0 && dna[k][i] != a[j] )j = next[j-1];if( dna[k][i] == a[j] ){ if( j == len-1 ) break;else j++;}else j = 0;}if( j < len-1 ) return false;}return true;}int main(){int cas,n;    int i,j,len;    bool flag;    int start,l;char *temp;cin >> cas;while( cas-- ){cin >> n;for( i = 0; i < n; i++ ){            cin >> dna[i];}flag = false;len = LEN;        while( len>=3 && !flag ){j = 0;for( i = 0;;i++ ){if( i+len <= LEN ){if( check(&dna[0][i],len,n) ){flag = true;if( j == 0 || strncmp(&dna[0][i],temp,len) < 0 ){temp = &dna[0][i];start = i;l = len;j++;}}}else break;}len--;}if(flag){for( i = start; i < start+l; i++ )cout << dna[0][i];cout << endl;}else cout << "no significant commonalities" << endl;}return 0;}


 

原创粉丝点击