串——病毒检测:BF检测
#include<iostream> #include <cstring> #include <fstream> using namespace std; #define MAXLEN 20 /* 病毒检测,BF算法,匹配子串 */ typedef struct{ char ch[MAXLEN+1]; int length; }SString; string StrAssign(SString &S,string e){ strcpy(S.ch,e.c_str()); S.length = e.length(); for(int i=S.length;i>0;i--){ S.ch[i] = S.ch[i-1]; } return "OK"; } int Index_BF(SString S,SString T){ //返回匹配成功的开始位置 int i,j ; i = j = 1; while(i <= S.length && j <= T.length ){ if( S.ch[i] == T.ch[j] ) {++i;++j;} else { i = i-j+2;j=1; } } if(j > T.length) return i-T.length; else return 0; } int main(){ ifstream inFile("Input.txt"); ofstream outFile("Output.txt"); SString Virus; SString Person; SString temp; char Vir[] = {' '}; int flag = 0; int m; int num; inFile >> num; while(num--){ //inFile >> Virus.ch+1; string V; string P; inFile >> V; strcpy(Virus.ch+1,V.c_str()); Virus.length = V.length(); //接收文件中的病毒DNA temp.length = V.length(); //初始化Virus和temp inFile >> P; strcpy(Person.ch+1,P.c_str()); //接收文件中的病人DNA Person.length = P.length(); outFile << Virus.ch+1 <<" "; //例子是通过Vir.ch来存储Virus.ch,然后在最后一起输出,因为 //赋值需要用到strcpy函数,就会让Vir.ch的地址与Virus.ch的地址 //联系在一起,Virus.ch变了,Vir.ch也会跟着变,所以提起输出 flag = 0; m = V.length(); for(int i = m+1,j=1;j<m;j++) Virus.ch[i++] = Virus.ch[j]; //将病毒DNA扩大1倍 //Virus.ch[2*m+1] = '\0'; //结束符号 for(int i=0;i<m;i++){ for(int j=1;j<=m;j++) temp.ch[j] = Virus.ch[i+j]; //病毒DNA为环状,轮流由第i个字母做开头 //temp.ch[m+1] = '\0'; cout << Person.ch+1<<" "<<temp.ch+1<<endl; flag = Index_BF(Person,temp); cout << flag<<endl; if(flag) break; } // cout << "Virus[2] is : "<< Virus.ch[2]; if(flag) outFile <<Person.ch+1 << " "<<"YES"<<endl; else outFile <<Person.ch+1 << " "<<"No"<<endl; } system("pause"); return 0; }