【KMP】 HRBUST 1309入 侵检测

入侵检测

Time Limit: 1000 MS Memory Limit: 32767 K

Description

入侵检测(Intrusion Detection)是对入侵行为的检测。它通过收集和分析网络行为、安全日志、审计数据、其它网络上可以获得的信息以及计算机系统中若干关键点的信息,检查网络或系统中是否存在违反安全策略的行为和被攻击的迹象。入侵检测作为一种积极主动地安全防护技术,提供了对内部攻击、外部攻击和误操作的实时保护,在网络系统受到危害之前拦截和响应入侵。因此被认为是防火墙之后的第二道安全闸门,在不影响网络性能的情况下能对网络进行监测。入侵检测通过执行以下任务来实现:监视、分析用户及系统活动;系统构造和弱点的审计;识别反映已知进攻的活动模式并向相关人士报警;异常行为模式的统计分析;评估重要系统和数据文件的完整性;操作系统的审计跟踪管理,并识别用户违反安全策略的行为。

其中特征检测(Signature-based detection) 又称Misuse detection ,假设入侵者活动可以用一种模式来表示,系统的目标是检测主体活动是否符合这些模式。它可以将已有的入侵方法检查出来。

现在给出主体活动和一个入侵者活动,判断改主体活动是否包含该入侵者活动。

Input

每行两个字符串,表示主体活动和入侵者活动,主体活动串不长与200000,入侵者活动串不长于2000

Output

如果主体活动包含入侵活动,输出”yes”,否则输出”no”,并换行。

Sample Input

abcdefg
abcd
abcde
bcdef

Sample Output

yes
no

Author

拂晓

题意

给出主串和字串,让你判断主串中是否含有字串。

思路

裸KMP

坑点

AC代码

#include<bits/stdc++.h>
using namespace std;

int nt[2006];
char str[200006];
char pre[2006];
int slen;
int plen;

 void get_next(void)
 {
    int k = -1;
    nt[0] = -1;
    for(int i = 1 ; i < plen ; i++)
    {
        while(k > -1&& pre[k+1]!=pre[i]){
            k = nt[k];
        }
        if(pre[k+1]==pre[i]) k++;
        nt[i] = k;
    }
 }

bool kmp(void)
{
    get_next();
    int k = -1;
    for(int i = 0 ; i < slen ; i++)
    {
        while(k > -1 && pre[k+1]!=str[i])
        {
            k = nt[k];
        }
        if(pre[k+1]==str[i]) k++;
        if(k==plen - 1) return true;
    }
    return false;
}


void solve(void)
{
    while(~scanf("%s%s",str,pre))
    {
        slen = strlen(str);
        plen = strlen(pre);
        if(kmp()) cout<<"yes"<<endl;
        else cout<<"no"<<endl;
    }
}

int main(void)
{
    solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/peng0614/article/details/80158716
kmp