DNA为环状检测一个DNA中是否有病毒DNA序列
#include <string>
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
typedef long long ll;
const int maxn= 1e5 + 5 ;
char x[ maxn] , y[ maxn] ;
int nex[ maxn] ;
char s[ maxn] ;
int BF ( char x[ ] , int m, char y[ ] , int n)
{
int i, j;
i= j= 0 ;
while ( i< n && j< m)
{
if ( y[ i] == x[ j] ) ++ i, ++ j;
else i= i- j+ 1 , j= 0 ;
}
if ( j>= m) return i- j;
else return - 1 ;
}
void get_nex ( char x[ ] , int m, int nex[ ] )
{
memset ( nex, 0 , maxn) ;
int i, j;
j= nex[ 0 ] = - 1 ;
i= 0 ;
while ( i< m)
{
while ( - 1 != j && x[ i] != x[ j] ) j= nex[ j] ;
if ( x[ ++ i] == x[ ++ j] ) nex[ i] == nex[ j] ;
else nex[ i] = j;
}
}
int kmp ( char x[ ] , int m, char y[ ] , int n)
{
int i, j;
get_nex ( x, m, nex) ;
i= j= 0 ;
while ( i< n)
{
while ( - 1 != j && y[ i] != x[ j] ) j= nex[ j] ;
i++ ; j++ ;
if ( j>= m) return i- j;
}
return - 1 ;
}
int main ( )
{
while ( scanf ( "%s%s" , y, x) )
{
bool flag= false ;
int m= strlen ( x) , n= strlen ( y) ;
strcat ( x, x) , strcat ( y, y) ;
for ( int i= 0 ; i< m; i++ )
{
int t= 0 ;
for ( int j= i; j< m+ i; j++ )
{
s[ t++ ] = x[ j] ;
}
get_nex ( s, m, nex) ;
int pos= kmp ( s, m, y, 2 * n) ;
if ( - 1 != pos)
{
flag= true ;
}
}
if ( flag) printf ( "YES\n" ) ;
else printf ( "NO\n" ) ;
}
return 0 ;
}