hdu 2825 Wireless Password 【ac自动机+dp】
来源:互联网 发布:网络有哪些好处 编辑:程序博客网 时间:2024/05/27 00:49
我的第一道ac自动机+dp
学了那么久ac自动机,直到现在才会把它和dp结合在一起
结合在一起也没以前感觉的那么神奇,实际上就是图论中的记忆化搜索,ac自动机是一个图,在这个图上进行dp过程就叫记忆化搜索,和树形dp也挺像的~
#include<iostream>#include<vector>#include<algorithm>#include<cstdio>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<cmath>#include<cassert>#include<cstring>#include<iomanip>using namespace std;#ifdef _WIN32#define i64 __int64#define out64 "%I64d\n"#define in64 "%I64d"#else#define i64 long long#define out64 "%lld\n"#define in64 "%lld"#endif#define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++)#define FF(i,a) for( int i = 0 ; i < (a) ; i ++)#define FFD(i,a) for( int i = (a)-1 ; i >= 0 ; i --)#define S64(a) scanf(in64,&a)#define SS(a) scanf("%d",&a)#define LL(a) ((a)<<1)#define RR(a) (((a)<<1)+1)#define pb push_back#define CL(Q) while(!Q.empty())Q.pop()#define MM(name,what) memset(name,what,sizeof(name))#define read freopen("in.txt","r",stdin)#define write freopen("out.txt","w",stdout)const int inf = 0x3f3f3f3f;const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;const double oo = 10e9;const double eps = 1e-10;const double pi = acos(-1.0);const int mod = 20090717;const int maxn = 121;const int maxc = 26;const int hashsize = 1<<10;const int head = 0;struct zz{ short to[26]; short fail; short id;}zx[maxn];struct aa{ int len; int pos; int s;}as;int n,m,k,use;string s;int dp[maxc][maxn][hashsize+1]; // len | now | statebool ok[maxn];int fs[maxn];bool hash[maxc][maxn][hashsize+1];char ss[12];inline int get(){ use++; zx[use].fail = 0; zx[use].id = -1; MM(zx[use].to,-1); return use;}void insert(int id,string& p){ int now = head; int c; for(int i=0;i<p.length();i++) { c = p[i] - 'a'; if(zx[now].to[c] != -1) { now = zx[now].to[c]; } else { zx[now].to[c] = get(); now = zx[now].to[c]; } } if(zx[now].id == id) { assert(false); } zx[now].id = id; return ;}void ac(){ queue<int>q; CL(q); q.push(head); int now,to,tmp; while(!q.empty()) { now = q.front(); q.pop(); for(int u=0;u<maxc;u++) if(zx[now].to[u] != -1) { to = zx[now].to[u]; q.push(to); tmp = now; while(tmp) { tmp = zx[tmp].fail; if(zx[tmp].to[u]!=-1) { zx[to].fail = zx[tmp].to[u]; break; } } } } return ;}int find(int now){ if(ok[now]) { return fs[now]; } else { int re = 0; ok[now] = true; if(now) { if(zx[now].id != -1) { re |= 1<<zx[now].id; } re |= find(zx[now].fail); } fs[now] = re; return re; }}void dps(){ dp[0][0][0] = 1; as.len = 0; as.pos = 0; as.s = 0; queue<aa>q; CL(q); q.push(as); hash[0][0][0] = true; aa now,to; int temp; while(!q.empty()) { now = q.front(); q.pop(); for(int i=0;i<26;i++) { if(zx[now.pos].to[i] != -1) { to.pos = zx[now.pos].to[i]; to.s = find(to.pos) | now.s; to.len = now.len + 1; } else { temp = now.pos; while(temp) { temp = zx[temp].fail; if(zx[temp].to[i] != -1) { temp = zx[temp].to[i]; break; } } zx[now.pos].to[i] = temp; to.len = now.len+1; to.pos = temp; to.s = find(temp) | now.s; } if(to.len <= n) { dp[to.len][to.pos][to.s] += dp[now.len][now.pos][now.s]; dp[to.len][to.pos][to.s] %= mod; if(!hash[to.len][to.pos][to.s]) { hash[to.len][to.pos][to.s] = true; q.push(to); } } } } return ;}int has(int temp){ int re = 0; for(int i=0;i<m;i++) { if(temp & (1<<i)) { re++; } } return re;}int start(){ ac(); for(int i=0;i<=n;i++) { for(int j=0;j<=use;j++) { for(int k=0;k<=(1<<m);k++) { dp[i][j][k] = 0; hash[i][j][k] = false; } } } MM(ok,false); dps(); int re = 0; for(int i=0;i<=use;i++) { for(int j=0;j<(1<<m);j++) { if(has(j)>=k) { re += dp[n][i][j]; re %= mod; } } } return re;}int main(){ while(cin>>n>>m>>k) { if(!n && !m & !k) break; use = -1; get(); for(int i=0;i<m;i++) { // cin>>s; scanf("%s",ss); s = ss; insert(i,s); } // cout<<start()<<endl; printf("%d\n",start()); } return 0;}
- hdu 2825 Wireless Password 【ac自动机+dp】
- HDU 2825 Wireless Password【AC自动机+DP】
- hdu 2825 Wireless Password(ac自动机&dp)
- 【HDU】2825 Wireless Password AC自动机+DP
- HDU - 2825 Wireless Password(AC自动机+DP)
- HDU 2825 Wireless Password (AC自动机,DP)
- hdu 2825 Wireless Password AC自动机+状态压缩DP
- HDU 2825 Wireless Password(AC自动机+状压DP)
- HDU 2825 Wireless Password && AC自动机+状压DP
- hdu 2825 Wireless Password(AC自动机+状压DP)
- HDU 2825 Wireless Password(AC自动机+状态压缩DP)
- [AC自动机+状压dp] hdu 2825 Wireless Password
- hdu 2825 Wireless Password(AC自动机+状压DP)
- HDU 2825 Wireless Password AC自动机 + 状态压缩DP
- hdu 2825 Wireless Password (ac自动机+状压dp)
- HDU 2825 Wireless Password (AC自动机 + 状态压缩DP)
- hdu 2825 Wireless Password (ac自动机+状态压缩dp)
- HDU 2825 Wireless Password (AC自动机+DP+状态压缩)
- C#委托,匿名方法和Lambda表达式(译)
- Excel VBA 提示“找不到工程或库”错误的解决办法
- schedule_timeout()
- 关于android apk安装
- HTML5实现3D校园地图思路
- hdu 2825 Wireless Password 【ac自动机+dp】
- IE6中Form.submit不提交的问题
- The reference to entity "characterEncoding" must end with the ';' delimiter
- 黑马程序员4--关于集合的事
- java内部类的总结
- IE Cookie文件格式说明
- 黑马程序员 字符串分割
- Taking a screenshot from within a Silverlight #WP7 application from http://geekswithblogs.net
- Hibernate 二级缓存 收集、总结整理