P11705 「KTSC 2020 R1」字符串查找
题目背景
**请使用 C++17 或 C++20 提交本题**
你需要在程序开头加入如下代码:
```cpp
#include
int findP(char T[], char P[], int N, int M);
```
题目译自 [2020년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사](https://www.ioikorea.kr/archives/ioitst/2020/) T1「 [문자열 찾기](https://assets.ioikorea.kr/ioitst/2020/1/match/match_statement.pdf)」
题目描述
对于由小写英文字母组成的两个字符串 $A$ 和 $B$,当满足以下条件时,称这两个字符串实际上相同:
1. $A$ 和 $B$ 的长度相同。
2. 对于所有可能的整数 $i$ 和 $j$,如果 $A$ 的第 $i$ 个字符和第 $j$ 个字符相同,则 $B$ 的第 $i$ 个字符和第 $j$ 个字符也相同。
3. 对于所有可能的整数 $i$ 和 $j$,如果 $A$ 的第 $i$ 个字符和第 $j$ 个字符不同,则 $B$ 的第 $i$ 个字符和第 $j$ 个字符也不同。
例如,$A=a b a$ 和 $B=p q p$ 是实际上相同的字符串。但是,$A=a b c a$ 和 $B=a b c b$ 不是实际上相同的字符串。
编写一个程序,你将会得到字符串 $T$ 和 $P$,计算 $T$ 的连续子字符串中与 $P$ 实际上相同的子字符串的数量。
例如,$T=a b a b a b b a b$ 和 $P=p q p$,$T$ 中从左到右的子字符串 $a b a, b a b, a b a, b a b, b a b$ 有 $5$ 个与 $P$ 实际上相同。
你需要实现以下函数:
`int findP(char T[], char P[], int N, int M);`
- `T` 是长度为 $N+1$ 的字符数组。
- `P` 是长度为 $M+1$ 的字符数组。
- `T` 和 `P` 分别存储了长度为 $N$ 和 $M$ 的小写英文字母字符串。`T` 和 `P` 的最后一个位置存储了 `'\0'`。
- `findP` 函数返回 `T` 的连续子字符串中与 `P` 实际上相同的子字符串的数量。
你需要提交一份代码,该代码中实现以下函数:
`int findP(char T[], char P[], int N, int M);`
该函数应按照上述描述工作。当然,你可以创建其他函数并在内部使用。提交的代码不应执行输入输出操作或访问其他文件。
输入格式
示例评测程序按以下格式读取输入:
- 第 $1$ 行:字符串 $T$
- 第 $2$ 行:字符串 $P$
输出格式
示例评测程序将输出你的代码中 `findP()` 函数返回的值。
说明/提示
### 样例说明 #1
| 函数调用 | 返回值 |
| :----------: | :----------: |
| `findP("abababbab", "pqp", 9, 3) ` | `5` |
### 数据范围
对于所有输入数据,满足:
- $1 \leq N \leq 10^6$
- $1 \leq M \leq N$
详细子任务附加限制及分值如下表所示。
| Subtask | 分值 | 约束 |
| :----------: | :----------: | :----------: |
|$1$|$8$|$N=M$|
|$2$|$5$|$1 \leq N \leq 100$|
|$3$|$12$|$1 \leq N \leq 2,000$|
|$4$|$75$|无附加限制|