[NOIP2002] 字串变换 宽搜+深度优化
Posted TS_Hugh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NOIP2002] 字串变换 宽搜+深度优化相关的知识,希望对你有一定的参考价值。
这道题硬是让我用STL水过.......而且题解里说的什么双向宽搜,交替扩展...............
这道题反正,STL用就用吧,但是状态数可以卡到千亿级别,因为这个东西是阶乘扩展的,然后我们发现他的深度会极大地影响状态数,然而如果我们把深度缩小为0.5倍,那么他的状态数也就是百万级别的,所以我们可以多源搜索来进行深度优化。
由此可见多源搜索是一个方式,深度优化是一种十分有效的优化.
#include <map> #include <cstdio> #include <string> #include <vector> #include <iostream> namespace Hash{ const int P=10000007; const int K=133; bool hash[10000007]; inline int Hash(std::string s){ int len=s.size(),ret=0; for(int i=0;i<len;i++) ret=(ret*K%P+s[i])%P; return ret; } inline bool ex(std::string s){ return hash[Hash(s)]; } } using namespace std; vector<string> temp,now; string a,b,stage[10][2]; int t; map<string,bool> just; int main(){ freopen("string.in","r",stdin); freopen("string.out","w",stdout); cin>>a>>b; while(cin>>stage[++t][0]) cin>>stage[t][1]; t--; now.push_back(a); for(int k=1;k<=10;k++){ temp.clear(); for(int i=0;i<now.size();i++) for(int j=1;j<=t;j++) if(now[i].find(stage[j][0],0)!=string::npos){ int pos=0; while(now[i].find(stage[j][0],pos)!=string::npos){ string s=now[i]; pos=now[i].find(stage[j][0],pos); s=s.replace(pos,stage[j][0].size(),stage[j][1]); if(Hash::ex(s)==0){ Hash::hash[Hash::Hash(s)]=1; if(s==b){ printf("%d",k); return 0; } temp.push_back(s); } pos+=stage[j][0].size(); } } now=temp; } printf("NO ANSWER!"); return 0; }
以上是关于[NOIP2002] 字串变换 宽搜+深度优化的主要内容,如果未能解决你的问题,请参考以下文章