zoj 3190 Resource Archiver 【构造最短不含病毒串的串】
来源:互联网 发布:mybatis如何打印sql 编辑:程序博客网 时间:2024/06/06 01:06
Run IDSubmit TimeJudge StatusProblem IDLanguageRun Time(ms)Run Memory(KB)User Name28971942012-05-19 09:54:06Accepted3190C++1103524zz_1215
ac自动机,我的方法是先用bfs构造最短路,然后在最短路的图上进行记忆化搜索,代码长的一b,敲完样例都没通过,- - 然后改了半天好不容易通过样例,一交。。。1y啊我擦!!奇迹了...
110ms...
#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 maxz = 100000;const int maxn = 1<<10;const int maxp = 111;const int head = 0;int zx[maxz][2];int fail[maxz];int id[maxz];int der[maxz];bool yes[maxz];bool no[maxz];bool vis[maxz];int dis[maxz];int way[maxp][maxp];int dp[maxp][maxn+1];int has[maxp];int hash[maxp];bool inq[maxz];int use,df;int n,m;vector<int>v;int get(){ use++; zx[use][0] = zx[use][1] = -1; id[use] = -2; fail[use] = 0; yes[use] = false; no[use] = false; return use;}void insert(int ids,string & p){ int now = head; int c; for(int i=0;i<p.length();i++) { c = p[i]-'0'; if(zx[now][c] != -1) { now = zx[now][c]; } else { zx[now][c] = get(); now = zx[now][c]; } } id[now] = ids; return ;}void ac(){ queue<int>q; CL(q); q.push(head); int now,to,temp; while(!q.empty()) { now = q.front(); q.pop(); for(int i=0;i<2;i++) { if(zx[now][i] != -1) { to = zx[now][i]; q.push(to); temp = now; while(temp) { temp = fail[temp]; if(zx[temp][i]!= -1) { temp = zx[temp][i]; break; } } fail[to] = temp; } } } return ;}bool findno(int now){ if(vis[now]) return no[now]; vis[now] = true; if(id[now]==-1) return no[now] = true; return no[now] = findno(fail[now]);}bool findyes(int now){ if(vis[now]) return yes[now]; vis[now] = true; if(no[now]) return yes[now] = false; if(id[now]>=0) return yes[now] = true; return yes[now] = findyes(fail[now]);}void find(int snow){ queue<int>q; CL(q); MM(inq,false); for(int i=0;i<=use;i++) { dis[i] = inf; } q.push(snow); inq[snow] = true; dis[snow] = 0; int now,to,temp; while(!q.empty()) { now = q.front(); q.pop(); for(int i=0;i<2;i++) { if(zx[now][i]!=-1) { to = zx[now][i]; } else { temp = now; while(temp) { temp = fail[temp]; if(zx[temp][i]!=-1) { temp = zx[temp][i]; break; } } zx[now][i] = temp; to = temp; } if(!no[to]) { if(dis[now] + 1 < dis[to]) { dis[to] = dis[now] + 1; if(!inq[to]) { q.push(to); inq[to] = true; } } } } inq[now] = false; } now = der[snow]; for(int i=0;i<=use;i++) { if(der[i]!=-1) { to = der[i]; way[now][to] = dis[i]; } } return ;}void find2(int now){ if(now) { if(id[now]>=0) { has[df] |= 1<<id[now]; } find2(fail[now]); } return ;}struct sa{ int pos; int sf;}sd;bool hashset[maxp][maxn+1];void ak(){ deque<sa>q; for(int i=0;i<=df;i++) { for(int j=0;j<(1<<n);j++) { dp[i][j] = inf; hashset[i][j] = false; } } q.clear(); sd.pos = 0; sd.sf = 0; q.push_back(sd); dp[0][0] = 0; hashset[0][0] = true; sa now,to; int temp; int cost; while(!q.empty()) { now = q.front(); q.pop_front(); for(int i=0;i<=df;i++) { if(i == now.pos) continue; temp = way[now.pos][i] + dp[now.pos][now.sf]; to.pos = i; to.sf = now.sf | has[i]; if(temp < dp[to.pos][to.sf]) { dp[to.pos][to.sf] = temp; if(!hashset[to.pos][to.sf]) { hashset[to.pos][to.sf] = true; if(!q.empty() && temp < dp[q.front().pos][q.front().sf] ) { q.push_front(to); } else { q.push_back(to); } } } } hashset[now.pos][now.sf] = false; } return ;}int start(){ for(int i=0;i<maxp;i++) { has[i] = 0; } df = 1; MM(vis,false); MM(has,0); MM(der,-1); ac(); vis[0] = true; no[0] = false; for(int i=0;i<=use;i++) findno(i); MM(vis,false); vis[0] = true; yes[0] = false; der[0] = 0; v.clear(); v.push_back(0); for(int i=0;i<=use;i++) if(findyes(i)) { find2(i); der[i] = df++; v.push_back(i); } for(int i=0;i<maxp;i++) { for(int j=0;j<maxp;j++) { way[i][j] = inf; } } for(int i=0;i<maxp;i++) { way[i][i] = 0; } df--; for(int i=0;i<v.size();i++) { find(v[i]); } ak(); int ans = inf; for(int i=0;i<=df;i++) { ans = min(ans,dp[i][(1<<n)-1]); } return ans;}int main(){ while(cin>>n>>m) { if(!n && !m) break; string s; use = -1; get(); for(int i=0;i<n;i++) { cin>>s; insert(i,s); } for(int i=1;i<=m;i++) { cin>>s; insert(-1,s); } cout<<start()<<endl; } return 0;}
- zoj 3190 Resource Archiver 【构造最短不含病毒串的串】
- 【ZOJ】 3190 Resource Archiver AC自动机+BFS预处理+DP
- HDOJ-3427 & ZOJ-3190 Resource Archiver AC自动机压缩状态DP..
- hdu 3247 Resource Archiver
- Resource Archiver hdu3247
- hdu 3247 Resource Archiver
- HDU3247 Resource Archiver
- HDU 3247 Resource Archiver
- HDU 3247Resource Archiver
- HDU3247 Resource Archiver(AC自动机+DP)
- 【AC自动机】 HDOJ 3247 Resource Archiver
- hdu3341 Resource Archiver AC自动机+DP
- 关于xcode真机调试或archiver时弹出钥匙串登录提示的解决
- HDU 3247 Resource Archiver(AC自动机+BFS+状态DP)
- hdu 3247 Resource Archiver(AC自动机+状压DP)
- [AC自动机+spfa+状压dp] hdu 3247 Resource Archiver
- hdu 3247 Resource Archiver(AC自动机+BFS+DP)
- hdu3247 Resource Archiver AC自动机+状态压缩DP
- Eclipse Indigo安装插件问题
- seo复习,使用插件ieHTTPHeaders查看服务器返回的http协议报头
- 对Jquery+JSON+WebService的一点认识
- 恢复win7快速启动栏
- 別讓網頁圖片降低網站效能 - 談談網頁圖片處理新趨勢
- zoj 3190 Resource Archiver 【构造最短不含病毒串的串】
- 雷神的微软平台安全宝典---第二章 简介
- DOS批处理中%cd%和%~dp0的异同
- 生产者-消费者模式
- MVC 3.0 Areas(区域)的使用
- 拥抱变革
- org.springframework.orm.hibernate3.HibernateSystemException: No default constructor for entity: ****
- Image 控制項圖片動態調整大小
- 命令行下运行php的方法和技巧