spoj 1811 Longest Common Substring(접미사 로봇)
코드
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 250005;
const int SIGMA_SIZE = 26;
struct SAM {
int sz, last;
int g[maxn<<1][SIGMA_SIZE], pre[maxn<<1], step[maxn<<1];
int tot;
void newNode(int s) {
step[++sz] = s;
pre[sz] = 0;
memset(g[sz], 0, sizeof(g[sz]));
}
int idx(char ch) { return ch -'a'; }
void init() {
tot = 0;
sz = 0, last = 1;
newNode(0);
}
int insert(char ch) {
newNode(step[last] + 1);
int v = idx(ch), p = last, np = sz;
while (p && !g[p][v]) {
g[p][v] = np;
p = pre[p];
}
if (p) {
int q = g[p][v];
if (step[q] == step[p] + 1)
pre[np] = q;
else {
newNode(step[p] + 1);
int nq = sz;
for (int j = 0; j < SIGMA_SIZE; j++) g[nq][j] = g[q][j];
pre[nq] = pre[q];
pre[np] = pre[q] = nq;
while (p && g[p][v] == q) {
g[p][v] = nq;
p = pre[p];
}
}
} else
pre[np] = 1;
tot += step[np] - step[pre[np]];
last = np;
return tot;
}
int solve(char* str) {
int n = strlen(str), p = 1, ans = 0, lcs = 0;
for (int i = 0; i < n; i++) {
int v = idx(str[i]);
if (g[p][v]) p = g[p][v], lcs++;
else {
while (p && g[p][v] == 0) p = pre[p];
if (p) lcs = step[p] + 1, p = g[p][v];
else lcs = 0, p = 1;
}
ans = max(ans, lcs);
}
return ans;
}
}SA;
char a[maxn], b[maxn];
int main () {
while (scanf("%s%s", a, b) == 2) {
int n = strlen(a);
SA.init();
for (int i = 0; i < n; i++) SA.insert(a[i]);
printf("%d
", SA.solve(b));
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.