vvalive 3942 Remember the Word(사전 트리 + DP)
해법:
dp[i]를 설정하면 i로 시작하는 문자열의 분해 방법을 나타냅니다.상태 이동 방정식: dp[i]=sum(dp[i+len(x)]), x는 S[i...L]의 접두사입니다.
단어 하나하나를 사전 트리에 삽입한 다음 긴 문자열 S의 접두사 s[i...L]를 고려하여 접두사 x가 사전 트리에 나타나는지 확인하고 나타날 때마다 dp[i]에 dp[i+len(x)]를 누적하면 된다.
총결산점의 수량 크기와 dp의 초기화에 주의하세요.
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
#define maxn 300005
#define maxm 26
#define mod 20071027
int tree[maxn][maxm],val[maxn],cnt;//Trie 、 、
int dp[300005];
void init()
{
cnt=1;
memset(tree[0],0,sizeof(tree[0]));
memset(dp,0,sizeof(dp));
}
inline void Insert(char *s,int v)
{
int id=0,l=strlen(s);
for(int i=0; i<l; ++i)
{
int c=s[i]-'a';
if(!tree[id][c])
{
memset(tree[cnt],0,sizeof(tree[cnt]));
tree[id][c]=cnt++;
val[cnt]=0;
}
id=tree[id][c];
}
val[id]=v;// v
}
inline void querry(char *s,int l,int pos)
{
int id=0;
for(int i=pos; i<l; ++i)
{
int c=s[i]-'a';
if(!tree[id][c]) return;
id=tree[id][c];
if(val[id]) dp[pos]=(dp[pos]+dp[i+1])%mod;
}
}
char str[300005],w[105];
int main()
{
int n,ca=1;
while(~scanf("%s",str))
{
scanf("%d",&n);
init();
for(int i=0; i<n; ++i)
{
scanf("%s",w);
Insert(w,1);
}
int l=strlen(str);
dp[l]=1;
for(int i=l-1;i>=0;--i) querry(str,l,i);
printf("Case %d: %d
",ca++,dp[0]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.