SCU 4438 Censor
Time Limit:0MS     Memory Limit:0KB     64bit IO Format:%lld & %llu
Practice

Description

frog is now a editor to censor so-called sensitive words (敏感词).

She has a long text w and remove it.

frog repeats over and over again. Help her do the tedious work.

Input

The input consists of multiple tests. For each test:

The first line contains p.

(w,p consists of only lowercase letter)

Output

For each test, write 1 string which denotes the censored text.

Sample Input

    abc
    aaabcbc
    b
    bbb
    abc
    ab

Sample Output

    a
    
    ab

/*/
题意:
给出两个字符串T和S,把所有在S中出现的T删掉,并且合并S,如果合并后还有T继续删掉。

KMP算法,练习

关键在于next表的建立,还有怎么利用next去查询字符串是否相同。

这里推荐一个大佬的博客,我也是从上面学习到的:
next->door( http://blog.csdn.net/sjf0115/article/details/8579484 )

然后KMP主要有两种用法,一种是用数组+模拟指针去覆盖掉匹配了的字符串,一种是用栈去弹掉匹配成功的串串,理论基本相同。

AC代码:
/*/

#include"algorithm"
#include"iostream"
#include"cstring"
#include"cstdlib"
#include"cstdio"
#include"string"
#include"vector"
#include"stack"
#include"queue"
#include"cmath"
#include"map"
using namespace std;
typedef long long LL ;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define FK(x) cout<<"["<<x<<"]\n"
#define memset(x,y) memset(x,y,sizeof(x))
#define memcpy(x,y) memcpy(x,y,sizeof(x))
#define bigfor(T)  for(int qq=1;qq<= T ;qq++)

const int MX=5555555;
/***************************************************/
char s[MX],t[MX],ans[MX];
int  next[MX],pos[MX],len1,len2;

void init() {
	memset(ans,0);
	memset(pos,0);
	memset(next,0);
}

struct Node {
	char ch;
	int j;
	Node() {};
	Node(char c,int n):ch(c),j(n) {};
};

void GetNext() {
	int i=0,j=-1;
	next[0]=-1;
	while(i<len2) {
		if(j==-1||t[i]==t[j]) {
			i++;
			j++;
			if(t[i]==t[j]) {
				next[i]=next[j];
			} else next[i]=j;
		} else j=next[j];
	}
}

void KMPStack() {
	int i = 0, j = 0;
	stack<Node> st;
	while(i < len1) {
		if(j == -1 || s[i] == t[j]) {//如果前面找不到相匹配的字符或者两个字符相同,加入栈。
			j ++;
			st.push(Node(s[i], j));
			i ++;
		} else j = next[j];
		if(j == len2) {  //匹配成功把栈内的匹配到的T串弹出。
			int len = len2;
			while(len --) st.pop();
			if(st.empty()) j = 0;//如果栈已经空了j返回到0;
			else j = st.top().j;	 //如果不是空的,j变为最后一个字符的next值。
		}
	}
	int cnt = 0;
	while(!st.empty()) {
		ans[cnt ++] = st.top().ch;
		st.pop();
	}
	for(int i=cnt-1; i>=0; i--) {
		putchar(ans[i]);
	}
	puts("");
}

/************************************************/
void KMP() {
	int i=0,j=0;
	int cnt=0;
	while(i<len1) {
		ans[cnt]=s[i++];  //字符串一个个的往暗示里面读入
		while(!(j==-1||ans[cnt]==t[j])) {
			j=next[j];
		}
		j++;
		cnt++;     //模拟指针
		pos[cnt]=j;
		if(j==len2) {  //如果找到匹配字符串长度的,指针指回该被匹配到的字符串最初位置
			cnt-=len2;
			j=pos[cnt];
		}
	}
//	puts(ans);
	for(int i=0; i<cnt; i++) {
		putchar(ans[i]);
	}
	puts("");
}
/************************************************/

int main() {
	while(~scanf("%s %s",t,s)) {
		init();
		len1=strlen(s);
		len2=strlen(t);
		GetNext();
//		KMP();	   //数组 
		KMPStack();//栈 
	}
	return 0;
}

  

 

 

 

相关文章:

  • 2021-08-01
  • 2021-09-26
  • 2021-11-30
  • 2022-03-01
  • 2021-11-20
  • 2022-02-27
  • 2021-09-14
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-27
  • 2022-12-23
  • 2022-12-23
  • 2022-01-21
相关资源
相似解决方案