首页 > 试题广场 >

攻击识别

[编程题]攻击识别
  • 热度指数:220 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

小明的服务器遭到了黑客的攻击,他想了一个简易的办法来判断服务器收到的数据包是否是来自黑客的攻击。

 

小明假设黑客的攻击都是往一些模式串里插入一个片段伪装出来的,例如模式串M为AN--ATTACK,那么黑客可能往M里插入一段信息,如在AN-后插入hello,来得到伪装后的数据包,AN-hello-ATTACK。小明想出了一系列的模式串Mi,你能否帮助小明判断服务器收到的数据包是否可能由某个模式串伪装而成。

 

示例,给定两个模式串M1=abc,M2=abd,那么数据包abec可能是攻击(模式M1),但数据包xyz则不属于M1、M2里面任何一个类型的攻击。

 

 



输入描述:
输入的第一行一个正整数n(1 ≤ n ≤ 100000),表示n种攻击模式。

接下来n行,其中第i行一个字符串Mi(1 ≤ strlen(Mi) ≤ 50),表示第i种攻击模式。

在接下来一个正整数k,表示有k(1 ≤ k ≤ 100)个数据包。

接下来k行,其中第i行一个字符串Di(1 ≤ strlen(Di) ≤ 1000),表示第i个数据包。

有50%的输入数据满足:1 ≤ n ≤ 10


输出描述:
输入k行,每行输出“YES”或者“NO”(全部大写)。

其中第i行表示第i个数据包有没有可能是攻击。
示例1

输入

3
abc
abd
xyz
6
abacac
affffbd
xxxxxxyyyyz
aaabbbbcccc
ifqwefxxf
xayaz

输出

YES
YES
YES
NO
NO
NO
#include <bits/stdc++.h>

using namespace std;
set<int> len;
unordered_map<string, int> mp;
void insert(string& s) {
    mp[s] = 1;
}
void process(string& s) {
    for (auto length : len) {
        if (s.size() < length) break;
        for (int i = 0; i <= length; i ++) {
            string tm;
            int l = i, r = length - i, siz = s.size();
            if (l) tm += s.substr(0, l);
            if (r) tm += s.substr(siz - r);
            if (mp[tm]) {
                cout << "YES\n";
                return;
            }
        }
    }
    cout << "NO\n";
}
int main() {
    int n, m;
    cin >> m;
    for (int i = 1; i <= m; i ++) {
        string s;
        cin >> s;
        len.insert(s.size());
        insert(s);
    }
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        string s;
        cin >> s;
        process(s);
    }
    return 0;
}

发表于 2022-08-13 18:33:54 回复(0)
#include<iostream>
#include <vector>
#include <string>

using namespace std;
int isattack(vector<string>&vec1, vector<string>& vec2, int n,int n2)
{
	if (vec1[n2] == vec2[n])
	{
		return 0;
	}
	
	int num1 = vec1[n2].size() - 1;//可以插num处地方
	int num2 = vec1[n2].size();
	int num3 = vec2[n].size();
    if(num3 < num2)
    {
        return 0;
    }
    if(vec2[n].substr(num3-num2,num2)==vec1[n2])
    {
        return 1;
    }
    if(vec2[n].substr(0,num2) == vec1[n2])
    {
        return 1;
    }
	for (int i = 1; i <= num1; i++)
	{
        
		string str1 = vec1[n2].substr(0, i);
		string str2 = vec1[n2].substr(i, num2 - i);

		if (vec2[n].substr(0, i) == str1 && vec2[n].substr(num3 - num2 + i, num2 - i) == str2)
		{
			return 1;
		}

	}
   
	return 0;
		
}
	

int main()
{
	int a;
	string b;
	
	string d;
	int c;
	vector<string>vec1;
	vector<string>vec2;
	cin >> a;
	int temp2 = a;
	while (a>0)
	{
		cin >> b;
		vec1.push_back(b);
		a--;
	}
	cin >> c;
	int temp = c;
	while (c>0)
	{
		cin >> d;
		vec2.push_back(d);
		c--;
	}
	int res = 0;
	for (int n = 0; n < temp; n++)
	{
		for (int n2 = 0; n2 < temp2; n2++)
		{
			res = isattack(vec1, vec2, n,n2 );
			if (res == 1)
			{
				cout << "YES" << endl;
				break;
			}
		}
		if (res == 0)
		{
			cout << "NO" << endl;
		}

		
	}

	return 0;
}

发表于 2021-09-14 17:34:48 回复(1)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;


public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while ((line = br.readLine()) != null) {
            int n = Integer.valueOf(line);
            String[] mode = new String[n];
            for (int i = 0; i < n; i++) {
                mode[i] = br.readLine();
            }
            int k = Integer.valueOf(br.readLine());
            boolean[] flag = new boolean[k];
            for (int i = 0; i < k; i++) {
                line = br.readLine();
                flag[i] = check(line, mode);
            }
            for (int i = 0; i < k; i++) {
                if (flag[i]) {
                    System.out.println("YES");
                } else {
                    System.out.println("NO");
                }
            }
        }
        br.close();
    }

    private static boolean check(String s, String[] mode) {
        int n = mode.length;
        int m = s.length();
        for (int i = 0; i < n; i++) {
            String cur_mode = mode[i];
            if (cur_mode.length() > m) continue;
            if (cur_mode.equals(s)) return true;
            int a = cur_mode.length();
            int l1 = 0;
            int count = 0;
            while (cur_mode.charAt(l1) == s.charAt(l1)) {
                l1++;
                count++;
                if(count == a) break;//防止越界
            }
            if (count == a) return true; // 提前返回
            int r = s.length() - 1;
            int r2 = a - 1;
            while (s.charAt(r) == cur_mode.charAt(r2)) {
                r--;
                r2--;
                count++;
                if(count == a) break; // 防止越界
            }
            if (l1 == r2 + 1 && r >= l1 && count == a) {
                return true;
            }
        }
        return false;
    }

}

编辑于 2020-10-15 18:09:12 回复(0)