LA 3942 트 리 + dfs (dp)
12874 단어 데이터 구조 - 트 리 트 리dfs
제목
문자열 을 지정 합 니 다. s 단 어 를 주 고 문자열 이 이 단어 들 로 구 성 된 배열 수 (단 어 는 중복 가능) 를 구 합 니 다.
해제
dfs 와 유사 한 심층 검색 방안 수 구 해 는 구성 단위 가 단어 라 는 차이 가 있 기 때문에 trie 수로 단 어 를 저장 할 수 있 습 니 다. 검색 할 때 단어 검색 을 찾 을 수 있 습 니 다. 기억 화 검색 은 시간 소 모 를 줄 이 고 나 무 를 만 든 후에 dp 역순 으로 도 할 수 있 습 니 다. dfs 의 원리 와 같 습 니 다.
AC code
dfs 트 리 저장 은 노드 방식 입 니 다.
/*
adrui's submission
Language : C++
Result : Accepted
Love : yy
Favorite : Dragon Balls
Standing in the Hall of Fame
*/
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define M(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define ls rt << 1, l, mid
#define rs rt << 1|1, mid + 1, r
#define lowbit(x) (x & (-x))
#define LL long long
#define REP(n) for(int i = 0; i < n; i++)
#define debug 0
const int mod(20071027);
const int maxn(3e5 + 5);
int dp[maxn];
int idx(char p) {
return p - 'a';
}
struct TrieTree {
bool exist;
TrieTree *next[26];
TrieTree() {
M(next, 0);
//cnt = 0;
exist = false;
}
void insert_node(char *s) {
TrieTree *root = this;
char *p = s;
while (*p) {
int tmp = idx(*p);
if (root->next[tmp] == NULL) {
root->next[tmp] = new TrieTree();
}
root = root->next[tmp];
++p;
}
root->exist = true;
}
int dfs(char *s, int tmp, int len) {
if (tmp > len) return 0;
if (tmp == len) return 1;// 1
if (dp[tmp] != -1) return dp[tmp];
dp[tmp] = 0;
TrieTree *root = this;
char *p = s;
int cnt = 1;
while (*p) {
int temp = idx(*p);
if (root->next[temp] == NULL) {//
break;
}
root = root->next[temp];
if (root->exist) dp[tmp] += dfs(p + cnt, tmp + cnt, len);// ,
++cnt;
++p;
}
return dp[tmp] %= mod;
}
};
int main() {
#if debug
freopen("in.txt", "r", stdin);
#endif //debug
cin.tie(0);
cin.sync_with_stdio(false);
char s[maxn];
char word[105];
int flag = 0, cnt, kase = 0;
while (cin >> s) {
TrieTree *root = new TrieTree();//
cout << "Case " << ++kase << ": ";
cin >> cnt;
while (cnt--) {
cin >> word;
root->insert_node(word);
}
M(dp, -1);
int ans = root->dfs(s, 0, strlen(s));
cout << ans << endl;
}
return 0;
}
역순 dp
/*
adrui's submission
Language : C++
Result : Accepted
Love : yy
Favorite : Dragon Balls
Standing in the Hall of Fame
*/
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define M(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define ls rt << 1, l, mid
#define rs rt << 1|1, mid + 1, r
#define lowbit(x) (x & (-x))
#define LL long long
#define REP(n) for(int i = 0; i < n; i++)
#define debug 0
const int mod(20071027);
const int maxn(5e5 + 5);
int dp[maxn];
int idx(char p) {
return p - 'a';
}
struct TrieTree {
bool exist;
TrieTree *next[26];
TrieTree() {
M(next, 0);
//cnt = 0;
exist = false;
}
void insert_node(char *s) {
TrieTree *root = this;
char *p = s;
while (*p) {
int tmp = idx(*p);
if (root->next[tmp] == NULL) {
root->next[tmp] = new TrieTree();
}
root = root->next[tmp];
++p;
}
root->exist = true;
}
int Dp(char *s, int len) {
dp[len] = 1;
for (int i = len - 1; i >= 0; --i) {
TrieTree *root = this;//
for (int j = i; j < len; ++j) {
int temp = idx(s[j]);
//cout << s[j] << endl;
if (root->next[temp] == NULL) {// dfs
break;
}
root = root->next[temp];
if (root->exist == true) {
dp[i] = (dp[i] + dp[j + 1]) % mod;//
//cout << j + 1 << " " << len << endl;
}
}
dp[i] %= mod;
}
return dp[0];
}
};
int main() {
#if debug
freopen("in.txt", "r", stdin);
#endif //debug
cin.tie(0);
cin.sync_with_stdio(false);
char s[maxn];
char word[105];
int flag = 0, cnt, kase = 0;
while (cin >> s) {
TrieTree *root = new TrieTree();
cout << "Case " << ++kase << ": ";
cin >> cnt;
while (cnt--) {
cin >> word;
root->insert_node(word);
}
M(dp, 0);
int ans = root->Dp(s,strlen(s));
cout << ans << endl;
}
return 0;
}
총결산
이 문 제 는 오후 에 30 분 동안 생각 하고 싶 습 니 다. 첫 번 째 코드 10 분, debug 1 시간.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
이진 트리: 최저 공통 조상(LCA)Leetcode 문제 를 참조할 수 있습니다. 이진 트리가 주어지면 트리에서 주어진 두 노드의 lowest common ancestor(LCA)를 찾으십시오. 입력: root = [3,5,1,6,2,0,8,null,...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.