题解 匹配
这世纪大水题爆成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;
}