标签:分析 name att 思路 描述 模拟 space math for
原题来自:USACO 2015 Feb. Silver
给出两个字符串\(S\)和\(T\),每次从前往后找到\(S\)的一个子串\(T\) 并将其删除,空缺位依次向前补齐,重复上述操作多次,直到\(S\)串中不含\(T\)串。输出最终的\(S\)串。
第一行包含一个字符串\(S\),第二行包含一个字符串\(T\)。
输出处理后的\(S\)串。
whatthemomooofun
moo
whatthefun
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#define N 1000010
using namespace std;
char s[N],t[N];
int f[N],sta[N],kmp[N],top; //kmp记录t本身的匹配情况,f记录s与t的匹配情况
int main(){
scanf("%s%s",s+1,t+1);
int ls = strlen(s+1),lt = strlen(t+1);
for(int i = 2,j=0;i<=lt;i++){ //KMP板子
while(j&&t[i]!=t[j+1])j = kmp[j];
if(t[i]==t[j+1])j++;
kmp[i] = j;
}
for(int i =1,j=0;i <= ls;i++){
while(j&&s[i]!=t[j+1])j = kmp[j];
if(s[i]==t[j+1])j++;
f[i] = j; //与上面操作相同,记录匹配情况
sta[++top] = i; //入栈
if(j==lt){
top-=lt; //整个T串弹出
j = f[sta[top]]; //sta存的是处理后的S串的下标
}
}
for(int i = 1;i <= top;i++){
printf("%c",s[sta[i]]);
}
return 0;
}
[USACO15FEB]Censoring S「KMP算法」
标签:分析 name att 思路 描述 模拟 space math for
原文地址:https://www.cnblogs.com/hhhhalo/p/13344065.html