hdu2825 - (AC 로봇 + 전압 DP)
dp[i+1][ret][k|v[ret]] = (dp[i+1][ret][k|v[ret]]+dp[i][j][k])%mod;
어떤 dp[i][j][k]는 0이면 연산을 안 해도 돼요.
#include
#include
#include
#include
#include
#include
using namespace std;
const int mod = 20090717;
int n,m,k;
struct tried{
int dp[30][105][1<<10];
int ch[105][26];
int f[105];
int v[105];
int sz;
void init(){
memset(f,0,sizeof(f));
memset(ch[0],0,sizeof(ch[0]));
memset(v,0,sizeof(v));
memset(dp,0,sizeof(dp));
dp[0][0][0] = 1;
sz = 1;
}
int idx(char c){
return c-'a';
}
int num(int x){
int ans = 0;
while(x){
if(x&1) ans++;
x /= 2;
}
return ans;
}
void insert(char *s,int id){
int u = 0,len = strlen(s);
for(int i = 0; i < len; i++){
int d = idx(s[i]);
if(!ch[u][d]){
memset(ch[sz],0,sizeof(ch[sz]));
ch[u][d] = sz++;
}
u = ch[u][d];
}
v[u] = 1<q;
for(int d = 0; d < 26; d++)
if(ch[u][d])
q.push(ch[u][d]);
while(!q.empty()){
u = q.front();
q.pop();
v[u] |= v[f[u]];
for(int d = 0; d < 26; d++){
if(!ch[u][d]){
ch[u][d] = ch[f[u]][d];
continue;
}
int ret = ch[u][d];
f[ret] = ch[f[u]][d];
q.push(ret);
}
}
}
void work(){
for(int i = 0; i < n; i++)
for(int j = 0; j < sz; j++)
for(int k = 0; k < (1<=k)
ans = (ans+dp[n][i][j])%mod;
printf("%d
",ans);
}
}word;
char s[105];
int main(){
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
if(n==0&&m==0&&k==0)
break;
word.init();
for(int i = 0; i < m; i++){
scanf("%s",s);
word.insert(s,i);
}
word.getfail();
word.work();
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ]11048(python)python 풀이 DP를 이용해 풀이 보통 이런 문제는 dfs나 bfs로 풀이하는 것이여서 고민을 했는데 이 문구 덕분에 DP 를 이용해 풀이할 수 있었다 뒤로 돌아가는 등의 경우를 고려하지 않아도 되기 때문이다 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.