入侵检测
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;
}