40pts悬关求调
查看原帖
40pts悬关求调
1181602
Cute_Furina楼主2025/7/22 21:06
#include<bits/stdc++.h>
using namespace std;
char s1[1000005], s2[1000005];
int Next[1000005], cnt, len1, len2, n, ss[1000005], st[1000005], top;
void getNext(char *p, int plen) {
	Next[0] = 0, Next[1] = 0;
	for(int i = 1;i <= plen;i ++) {
		int j = Next[i];
		while(j && p[i] != p[j]) {
			j = Next[j];
		}
		if(p[i] == p[j]) {
			Next[i + 1] = j + 1;
		}
		else Next[i + 1] = 0;
	}
}
void kmp(char *s, char *p) {
	int last = -1;
	int slen = strlen(s), plen = strlen(p);
	getNext(p, plen);
	int j = 0;
	for(int i = 0;i < plen;i ++) {
		while(j && p[i] != s[j]) {
			j = Next[j];
		}
		if(p[i] == s[j]) j ++;
		ss[i] = j; 
		st[++ top] = i;
		if(j >= slen) {
			top -= slen;
			j = ss[st[top]];
			last = i; 
		}
	} 
}
signed main() {
	cin >> s2 >> s1;
	kmp(s1, s2);
	for(int i = 1;i <= top;i ++) {
		cout << s2[st[i]];
	}
}
2025/7/22 21:06
加载中...