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

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

你可能感兴趣的:(哈理工oj)