BZOJ1030 JSOI 2007 텍스트 생성기 문제풀이 & 코드
/**************************************************************
Problem: 1030
User: Rainbow6174
Language: C++
Result: Accepted
Time:76 ms
Memory:4396 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#define MOD 10007
using namespace std;
const int maxt = 6005;
int n, m, tot, ans = 1, temp, ch[maxt][26], fail[maxt], q[maxt], dp[105][maxt];
char s[105];
bool flag[maxt];
void newnode(int x, int v)
{
ch[x][v]=++tot;
}
void addtrie(char s[])
{
int x = 0, p = 0, len = strlen(s);
while( p < len )
{
temp = s[p]-'A';
if ( !ch[x][temp] ) newnode(x, temp);
x = ch[x][temp];
p++;
}
flag[x] = 1;
}
void AC(void)
{
int h = 0, t = 0;
for(int i = 0; i < 26; i++)
if(ch[0][i]) q[t++] = ch[0][i];
while( h < t )
{
temp = q[h++];
for(int i = 0; i < 26; i++)
if( !ch[temp][i] ) ch[temp][i] = ch[fail[temp]][i];
else fail[ch[temp][i]] = ch[fail[temp]][i],
flag[ch[temp][i]] |= flag[fail[ch[temp][i]]],
q[t++] = ch[temp][i];
}
}
int main(void)
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
{
scanf("%s", s);
addtrie(s);
}
AC();
dp[0][0] = 1;
for(int i = 1; i <= m; i++)
{
for(int j = 0; j <= tot; j++)
{
if(flag[j] || !dp[i-1][j]) continue;
for(int k = 0; k < 26; k++)
{
dp[i][ch[j][k]] += dp[i-1][j];
dp[i][ch[j][k]] %= MOD;
}
}
ans*=26;
ans%=MOD;
}
//cout<<ans<<endl;
for(int i = 0; i <= tot; i++)
{
//cout<<i<<' '<<flag[i]<<endl;
if(!flag[i])
{
//cout<<dp[m][i]<<endl;
ans -= dp[m][i];
ans += MOD;
ans %= MOD;
}
}
printf("%d
",ans);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
bzoj1010 장난감 포장 [결정 단조성 최적화 dp]하나의 모범 문제라고 할 수 있다.우리는 먼저 소박한 dp방정식을 얻을 수 있다. f[i]=min(f[j]+w(j,i)),j∈[0,i). w(j,i)는 j+1~i를 포장하여 운송하는 비용의 시간 복잡도는 O(n2)라...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.