poj 1625
ac自动机+高精+dp
高精输出适用了cout.wide cout.fill('0');
代码:
#include<iostream>
#include<fstream>
using namespace std;
struct e{
int p[51];
int end;
}trie[501];
int n,m,K;
int hash[600];
int state=1;
int f[501];
void build(char c[]){
int i,j=0,k;
for(i=1;;)
{
if(trie[i].p[hash[c[j]]]==0)
trie[i].p[hash[c[j]]]=++state;
i=trie[i].p[hash[c[j]]];
j++;
if(j>=strlen(c))
break;
}
trie[i].end=1;
}
void ac(){
int q[501];
int l=0,r=0;
int i,j,k;
for(i=0;i<n;i++)
if(trie[1].p[i])
{
q[++r]=trie[1].p[i];
f[trie[1].p[i]]=1;
}
else
{
trie[1].p[i]=1;
}
while(l<r){
i=q[++l];
for(j=0;j<n;j++)
{
if(trie[i].p[j])
{
q[++r]=trie[i].p[j];
k=f[i];
while(!trie[k].p[j])
k=f[k];
f[trie[i].p[j]]=trie[k].p[j];
trie[trie[i].p[j]].end|=trie[trie[k].p[j]].end;
}
}
}
}
int dp[51][501][100];
void plus(int *a,int *b){
int i,j=0,k;
int c[101];
for(i=0;i<99;i++)
{
k=a[i]+b[i]+j;
c[i]=k%10000;
j=k/10000;
}
for(i=0;i<99;i++)
a[i]=c[i];
}
void print(int *a){
int i,j,k;
j=99;
while(j>=0&&a[j]==0)
j--;
if(j==-1)
{
cout<<0<<endl;
return;
}
cout<<a[j];cout.fill('0');
for(i=j-1;i>=0;i--)
{
cout.width(4);
cout<<a[i];
}
cout<<endl;
}
void Pr(int *r)
{
int i;
for(i=99;i>0;i--)
if (r[i]!=0)
break;
cout<<r[i];
cout.fill('0');
for(i--;i>=0;i--)
{
cout.width(4);
cout<<r[i];
}
cout<<endl;
}
void loop(){
int i,j,k,s;
for(i=1;i<=state;i++)
if(trie[i].end==0)
dp[0][i][0]=1;
for(s=0;s<m;s++)
for(i=1;i<=state;i++)
if(trie[i].end)
continue;
else
{
for(j=0;j<n;j++)
if(trie[i].p[j])
{
k=trie[i].p[j];
if(trie[k].end==0)
plus(dp[s+1][i],dp[s][k]);
}
else
{
k=f[i];
while(!trie[k].p[j])
k=f[k];
if(!trie[trie[k].p[j]].end)
{
k=trie[k].p[j];
plus(dp[s+1][i],dp[s][k]);
}
}
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
char c[60];
cin>>n>>m>>K;
cin>>c;
for(i=0;i<strlen(c);i++)
hash[c[i]]=i;
for(i=1;i<=K;i++)
{
cin>>c;
build(c);
}
ac();
loop();
print(dp[m][1]);
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号