

`=>` C++
Cho xâu SS độ dài N (N≤1e5). Tính và đưa ra dãy t1,t2,...,tN với titi là số lần xuất hiện của xâu S1S2...Si trong xâu S.
Dữ liệu
Gồm một dòng duy nhất là xâu SS gồm các chữ cái latin thường độ dài không quá 1e5
Kết quả
Gồm một dòng duy nhất đưa ra các giá trị t1,t2,...,tN cách nhau một dấu cách
Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
\begin{array}{c} \color{#FFFFFFff}{H}\color{#E7E7E7ff}{o}\color{#CFCFCFff}{r}\color{#B7B7B7ff}{i}\color{#9F9F9Fff}{z}\color{#878787ff}{o}\color{#6F6F6Fff}{n} \end{array} $\\$
#include <bits/stdc++.h>
using namespace std;
#define N 100000
string s;
int f[N+3], d[N+3], res[N+3];
void solve() {
cin >> s;
int n=s.size();
memset(f,0,sizeof(f));
memset(d,0,sizeof(d));
memset(res,0,sizeof(res));
int l=0, r=0;
for (int i=1; i<n; i++) {
if (i>r) {
l=r=i;
while (r<n && s[r-l]==s[r]) r++;
f[i]=r-l;
r--;
} else {
int k=i-l;
if (f[k]<r-i+1) f[i]=f[k];
else {
l=i;
while (r<n && s[r-l]==s[r]) r++;
f[i]=r-l;
r--;
}
}
}
for (int i=0; i<n; i++) d[f[i]]++;
for (int i=n-1; i>0; i--) d[i]+=d[i+1];
for (int i=1; i<= n; i++) res[i-1]=d[i]+1;
for (int i=0; i<n; i++) cout << res[i] << " ";
}
int main() {
solve();
return 0;
}Hãy giúp mọi người biết câu trả lời này thế nào?

Đáp án:
int main()
{
string s;
cin >> s;
int n = s.length();
vector<int> t(n, 0);
for (int i = 0; i < n; ++i) {
string sub = s.substr(0, i + 1);
for (int j = 0; j <= n - sub.length(); ++j) {
if (s.substr(j, sub.length()) == sub) {
t[i]++;
}
}
}
for (int i = 0; i < n; ++i) {
cout << t[i] << (i == n - 1 ? "" : " ");
}
cout << endl;
return 0;
}
Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin
929
1184
640
Gửi ngài ạ
1726
5585
2591
chỉ tiếc ko có hay nhất =))
929
1184
640
:))
1726
5585
2591
:)