题目描述
原题来自:USACO 2015 Feb. Silver
给出两个字符串 SSS 和 TTT,每次从前往后找到 SSS 的一个子串 A=TA=TA=T 并将其删除,空缺位依次向前补齐,重复上述操作多次,直到 SSS 串中不含 TTT 串。输出最终的 SSS 串。
输入
第一行包含一个字符串 SSS,第二行包含一个字符串 TTT。
输出
输出处理后的 SSS 串。
样例输入
whatthemomooofun
moo
样例输出
whatthefun
提示
对于全部数据,1≤∣T∣≤∣S∣≤1061\le |T|\le |S|\le 10^61≤∣T∣≤∣S∣≤106,保证字符串中只出现小写字母。
来源
/*
题目:1053KMP算法
时间:2018/11/15-2018/11/17
编译器:vs2013
心得:1.分配空间需要的头文件include <stdlib.h>;
2.识别true的头文件#include <stdbool.h>;
3.malloc动态分配内存:(数据类型指针)malloc(sizeof(数据类型)*长度);
4.向函数传结构体:if是改变结构体的值传结构指针,if是获取结构体的数据直接传结构体;
5.puts()和gets()是关于字符串,回车符作为结束标志'\0';
*/
#include <stdio.h>
#include <stdlib.h>//malloc头文件
#include <stdbool.h>//true头文件
#define N 1000
//创建结构体
typedef struct{
char *str;//存串
int length;//串的长度
}HeapString;
//初始化
void InitString(HeapString *S){
S->length = 0;
S->str = '\0';
}
//进行赋值
void StrAssign(HeapString *S, char cstr[]){
int i = 0, len;
for (i = 0; cstr[i] != '\0'; i++){
len = i;
}
//len = 15
S->str = (char*)malloc(sizeof(char)*len);
for (i = 0; i <= len; i++){//当时len有点没算明白
S->str[i] = cstr[i];
}
S->length = len+1;
}
//NEXT
void GetNext(HeapString T,int next[]){
int j, k,i;
j = 0;
k = -1;
next[0] = -1;
while (j < T.length){
if (k == -1 || T.str[j] == T.str[k]){
j++;
k++;
next[j] = k;
}
else{
k = next[k];
}
}
}
//KMP
int kmp_Index(HeapString S, HeapString T, int next[]){
int i, j;
//for (i = 0; i < 3; i++){
//printf("%d", next[i]);
//}
i = 0;
j = 0;
while (i < S.length &&j < T.length){
if (j == -1 || S.str[i] == T.str[j]){
i++;
j++;
}
else{
j = next[j];
}
}
if (j >= T.length){
return i - T.length + 1;
}
else{
return -1;
}
}
//删除啧啧啧
void StrDelete(HeapString *S, int pos, int len){//从pos位置开始删除len个
int i;
for (i = pos + len; i < S->length; i++) {
S->str[i - len] = S->str[i];
}
S->length = S->length - len;
}
//输出
void StrPrint(HeapString S){
int i;
for (i = 0; i < S.length; i++){
printf("%c", S.str[i]);
}
printf("\n");
}
int main(){
//定义变量
char ch1[N], ch2[N];
int next[N];
HeapString S, T;
int i, m, len, find;
//初始化
InitString(&S);
InitString(&T);
//进行赋值
gets(ch1);
StrAssign(&S, ch1);
gets(ch2);
StrAssign(&T, ch2);
//计算T的长度
for (i = 1; ch2[i] != '\0'; i++){
len = i;
}
//计算NEXT数组
GetNext(T, next);
while (true){
//确定位置
find = kmp_Index(S, T, next);
if (find == -1){
break;
}
find--;
//进行删除
StrDelete(&S, find, len);
}
//输出
StrPrint(S);
return 0;
}