哈理工OJ—1309入侵检测(字符串处--剪枝)

来源:互联网 发布:知乎怎么发帖子 编辑:程序博客网 时间:2024/05/17 09:10

入侵检测
Time Limit: 1000 MS Memory Limit: 32767 K
Total Submit: 514(158 users) Total Accepted: 190(129 users) Rating: Special Judge: No
Description
入侵检测(Intrusion Detection)是对入侵行为的检测。它通过收集和分析网络行为、安全日志、审计数据、其它网络上可以获得的信息以及计算机系统中若干关键点的信息,检查网络或系统中是否存在违反安全策略的行为和被攻击的迹象。入侵检测作为一种积极主动地安全防护技术,提供了对内部攻击、外部攻击和误操作的实时保护,在网络系统受到危害之前拦截和响应入侵。因此被认为是防火墙之后的第二道安全闸门,在不影响网络性能的情况下能对网络进行监测。入侵检测通过执行以下任务来实现:监视、分析用户及系统活动;系统构造和弱点的审计;识别反映已知进攻的活动模式并向相关人士报警;异常行为模式的统计分析;评估重要系统和数据文件的完整性;操作系统的审计跟踪管理,并识别用户违反安全策略的行为。
其中特征检测(Signature-based detection) 又称Misuse detection ,假设入侵者活动可以用一种模式来表示,系统的目标是检测主体活动是否符合这些模式。它可以将已有的入侵方法检查出来。

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

Input
每行两个字符串,表示主体活动和入侵者活动,主体活动串不长与200000,入侵者活动串不长于2000
Output
如果主体活动包含入侵活动,输出”yes”,否则输出”no”,并换行。
Sample Input
abcdefg
abcd
abcde
bcdef
Sample Output
yes
no


教你小小的剪枝一下吧。
字符串朴素匹配的时候不光要看首字母而且要看末字母,这样子你的数据卡的就比较到位了。
下面是AC代码:

#include<cstdio>#include<string.h>#include<algorithm>using namespace std;char str1[200005],str2[2005];int judge(int i,int j){    int ss=0;    for(int k=i;k<i+j;k++)    {        if(str1[k]==str2[ss])        {            ss++;        }        else        {            return 0;        }    }    return 1;}int main(){    while(~scanf("%s %s",str1,str2))    {        int le1=strlen(str1);        int le2=strlen(str2);        int flag=0;        for(int i=0;i<le1;i++)        {            if(str1[i]==str2[0]&&str1[i+le2-1]==str2[le2-1])            {                flag=judge(i,le2);            }            if(flag==1)            {                break;            }        }        if(flag==1)        {            printf("yes\n");        }        else        {            printf("no\n");        }    }    return 0;}
0 0