题解 匹配

传送门

这世纪大水题爆成18分就是耻辱
求个next数组就行
然而前缀包括它自身,所以要特判最长前缀就是它自身的情况

Code: 还放吗

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
#define ll long long 
#define ld long double
#define usd unsigned
#define ull unsigned long long
//#define int long long 

int n, m;
int nxt[N];
char s[N], t[N], add;

inline char readc() {
	char c=getchar();
	while (!isalpha(c)) c=getchar();
	return c;
}

signed main()
{
	#ifdef DEBUG
	freopen("1.in", "r", stdin);
	#endif
	int T;
	
	scanf("%d", &T);
	while (T--) {
		scanf("%d%d%s", &n, &m, s+1);
		add = readc();
		//cout<<add<<endl;
		memset(nxt, 0, sizeof(nxt));
		memcpy(t, s, sizeof(s));
		++m; t[m]=add;
		//for (int i=1; i<=m; ++i) cout<<t[i]<<' '; cout<<endl;
		nxt[1] = 0;
		for (int i=2,j=0; i<=m; ++i) {
			while (j && t[i]!=t[j+1]) j=nxt[j];
			if (t[i]==t[j+1]) ++j;
			nxt[i] = j;
		}
		printf("%d\n", max(t[m]==s[m]min(nxt[m], n));
	}

	return 0;
}
posted @ 2021-06-12 11:57  Administrator-09  阅读(17)  评论(0编辑  收藏  举报