题解 | #Youhane Assembler#
Youhane Assembler
https://ac.nowcoder.com/acm/problem/15489
KMP匹配(Next数组的应用)
题意:
题目链接戳这里QAQ
大致题意就是给你N(1≤N≤300000)个字符串,然后不停的询问,(l,r),求最长的len是r的前缀子串与l的后缀子串相等的长度,例如样例中(1,3),及l串是AAAA,r串是AACCGGTT,那么最长的len就是AA,及为2。我们只需要将r与l拼接去求Next数组就行,答案就是Next[str.length()];
注意这样的几点这题就很好AC,首先如果l和r相同那么答案就是l.length=r.lenth,其次如果L串为AAAA,R串是AAAAAAA,那么答案只能是AAAA(4)。所以为了避免这种情况我们在处理的时候在r与l串中间加两个不同的字符就可以了。“@#”
KMP戳这 KMP不懂的戳这里。
#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<math.h>
#include<map>
#include<sstream>
#include<list>
#define STD using namespace std;
#define ll long long
#define db double
#define ldb long double
#define IOS std::ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0);
#define MAX 88888888;
#define INF 0x7fffffff
#define r0 return 0;
#define SYP system("pause");
#define endl '\n';
STD;
int n;
string str[300000 + 7];
string p;
int Next[300000 + 7];
void inNext() {
int j = 0, k = -1;
Next[0] = -1;
int plen = p.length();
while (j < plen)
{
if (k == -1 || p[k] == p[j])
{
j++;
k++;
Next[j] = k;
}
else
{
k = Next[k];
}
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> str[i];
}
int m;
cin >> m;
while (m--)
{
int l, r;
cin >> l >> r;
p = str[r] +"!#"+ str[l];
inNext();
cout << Next[p.length()] << endl;
}
}
查看7道真题和解析
阿里巴巴公司氛围 652人发布