栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 1625 Censored!

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 1625 Censored!

#include<iostream>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(){    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;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376838.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号