(KMP)
题意:给出一个n,随后给你n条字符串(1~n),再给出一个q,表示q次询问,每次询问给出一个u,v,要求返回第u条字符串的后缀字符串和第v条字符串的前缀字符串的最大匹配数(即最大相同个数)
解法:题目保证每个文件只有一组数据而且数据总的字符串长度不会超过3e5,因此每个子串都很短,实际上暴力就可以过(现场数据的确都被暴力过了,然而我用的是KMP)在这里的kmp模板直接返回题目要的答案,不懂可以学一手kmp。
代码如下:
#include<cmath> #include<cstdlib> #include<string> #include<cstring> #include<algorithm> #include<stdio.h> #include<iostream> using namespace std; #define ll long long const int maxn = 3e5 + 500; string s[maxn]; int nxt[maxn]; void get_next(int y) { int len = s[y].length(); int i = 0, j = -1; nxt[0] = -1; while (i<len) { if (j == -1 || s[y][i] == s[y][j]) { i++; j++; nxt[i] = j; } else j = nxt[j]; } } int kmp(int x, int y) { int len1 = s[x].length(), len2 = s[y].length(); int i = 0, j = 0; get_next(y); while (i<len1) { if (j == -1 || s[x][i] == s[y][j]) { i++; j++; } else j = nxt[j]; } if (i == len1) return j; return 0; } int main() { int n; cin >> n; for (int i = 1; i <= n; i++) cin >> s[i]; int q, x, y; cin >> q; while (q--) { scanf("%d%d", &x, &y); if (x == y)cout << s[x].length() << endl; else cout << kmp(x, y) << endl; } return 0; }