zoukankan      html  css  js  c++  java
  • 串——病毒检测: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] = '';                   //结束符号
    
            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] = '';
            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;
    }
  • 相关阅读:
    用动画切换按钮的状态
    用UICollectionView实现无限轮播图
    水平方向瀑布流
    UICollectionViewFlowLayout使用示例
    旋转木马效果
    Greenplum集群或者Postgresql出现死锁肿么办?
    Lucene的全文检索学习
    Jms规范学习
    Nginx的相关问题
    keepalived+Nginx实现主备保障Nginx的高可用。
  • 原文地址:https://www.cnblogs.com/LuMinghao/p/14017105.html
Copyright © 2011-2022 走看看