#include
#include
#include
#include
using namespace std;
const int N = 1e5 + 10, M = 1e6 + 10;
char buffs[N], buffp[N], p[N], s[M];
int n, m;
int ne[N];
void delete_char(char *str, char target)
{
int i, j;
for (i = 0, j = 0; str[i] != '\0'; ++ i)
{
if (str[i] != target) str[j ++] = str[i];
}
str[j] = '\0';
}
bool KMP(char *s, char *p)
{
ne[0] = -1;
for (int i = 1, j = -1; i < n; ++ i)
{
while (j != -1 && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j ++;
ne[i] = j;
}
for (int i = 0, j = -1; i < m; ++ i)
{
while (j != -1 && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j ++;
if (j == n - 1)
{
return true;
// cout << i - j << " ";
// j = ne[j];
}
}
return false;
}
int main()
{
cout << "核查结果如下:" << endl;
FILE *fp;
// 读取模式串s
if ((fp = fopen("E://全体名单.txt", "r")) == NULL)
{
printf("文件打开错误\n");
exit(0);
}
while (!feof(fp))
{
fgets(buffs, sizeof(buffs), fp);
strcat(s, buffs);
}
m = strlen(s);
delete_char(s, '\n');
// printf("%s\n", s);
// 读取模板串p
if ((fp = fopen("E://登记名单.txt", "r")) == NULL)
{
printf("文件打开错误\n");
exit(0);
}
while (!feof(fp))
{
fgets(buffp, sizeof(buffp), fp);
delete_char(buffp, '\n');
// printf("%s\n", buffp);
n = strlen(buffp);
if (KMP(s, buffp))
cout << buffp << " " << "已接种" << endl;
else
cout << buffp << " " << "未接种" << endl;
}
return 0;
}
