[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] 字串变换 宽搜+深度优化的主要内容,如果未能解决你的问题,请参考以下文章

[NOIP2002]字串变换 T2 双向BFS

[NOIP2002] 提高组P1032 字串变换

noip提高组2002 字串变换(luogu P1032 )

1099 字串变换

noip2002提高组题解

NOIP2002 字符变换