题目描述
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
输入
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
输出
删除输入的短字符串(不区分大小写)并去掉空格,输出。
样例输入
in
#include
int main()
{
printf(" Hi ");
}
样例输出
#clude
tma()
{
prtf("Hi");
}
提示
注:将字符串中的In、IN、iN、in删除。
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <ctype.h>
#define MATCH 100
#define MAX 1000
int fail[MATCH];
void compute_prefix(char *p)
{
int i, m, k;
m = strlen(p);
k = 0;
for (i = 2; i <= m; i ++) {
while (k > 0 && p[k] != p[i - 1]) {
k = fail[k - 1];
}
if (p[k] == p[i - 1]) {
k = k + 1;
}
fail[i - 1] = k;
}
}
int kmp_match(char *p, char *s, char *flag)
{
int i, m, n, k, j;
// 初始化匹配数组
memset(flag, -1, sizeof(flag));
// 初始化fail数组
compute_prefix(p);
m = strlen(p);
n = strlen(s);
k = j = 0;
for (i = 0; i < n; i ++) {
while (k > 0 && p[k] != s[i]) {
k = fail[k - 1];
}
if (p[k] == s[i]) {
k = k + 1;
}
if (k == m) {
flag[j] = i - m + 1;
j ++;
k = fail[k - 1];
}
}
return j;
}
int main()
{
char p[MATCH], t[MAX][MAX], s[MAX][MAX], flag[MAX];
int i, m, num, index, j, k, sign;
// 处理模式串
scanf("%s", p);
getchar();
m = strlen(p);
for (i = 0; i < m; i ++) {
if (p[i] >= 'A' && p[i] <= 'Z') {
p[i] = tolower(p[i]);
}
}
// 接收文本串
for (index = 0; gets(t[index]); index ++) {
if (strcmp(t[index], "}") == 0) {
break;
}
}
// 复制文本串转小写
for (i = 0; i <= index; i ++) {
for (j = 0; j < strlen(t[i]); j ++) {
if (t[i][j] >= 'A' && t[i][j] <= 'Z') {
s[i][j] = tolower(t[i][j]);
}else {
s[i][j] = t[i][j];
}
}
}
// 按行kmp匹配
for (i = 0; i <= index; i ++) {
// 判断是否是匹配点
num = kmp_match(p, s[i], flag);
for (j = 0; j < strlen(t[i]);) {
for (k = 0, sign = 1; k < num; k ++) {
if (flag[k] == j) {
sign = 0;
break;
}
}
if (sign) {
if (t[i][j] != ' ') {
printf("%c", t[i][j]);
}
j ++;
}else {
j += m;
}
}
printf("\n");
}
printf("\n");
return 0;
}