【noip 2002】字串变换

来源:互联网 发布:java面试宝典下载 编辑:程序博客网 时间:2024/06/05 15:48

去题面的传送门
BFS
很暴力很暴力,因为数据范围实在是太小了
wa在了hash上。
以后hash的底数还是选质数吧

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int mo=2333,e=301;int cnt,hash_A,hash_B,Ans;int la[30],lb[30];string A,B;string a[10],b[10];bool vis[100000];struct lxt{    int hash,num;    string s;};queue<lxt>q;int bfs(){    int lA=A.length();    int lB=B.length();    for(int i=0;i<lA;++i) hash_A=(hash_A%mo+(A[i]*e)%mo)%mo;    q.push((lxt){hash_A,0,A});    vis[hash_A]=true;    while(!q.empty())    {        string s;        s=q.front().s;        int num=q.front().num;        q.pop();        int lu=s.length();        for(int k=1;k<=cnt;++k)        {            for(int i=0;i<lu;++i)            {                int j;                for(j=0;j<la[k];++j)                  if(s[i+j]!=a[k][j]) break;                if(j==la[k])                {                    string ans;                    int where=i;                    for(int t=0;t<where;++t) ans+=s[t];                    ans+=b[k];                    for(int t=where+la[k];t<lu;++t) ans+=s[t];                    if(ans==B)                    {                        if(num<10)return num+1;                        return -1;                    }                    int hash=0;                    for(int t=0;t<lu-la[k]+lb[k];++t)                        hash=((hash%mo+(ans[t])%mo)*e%mo)%mo;                    if(!vis[hash])                    {                        vis[hash]=true;                        q.push((lxt){hash,num+1,ans});                    }                }            }        }    }    return -1;}int main(){    cin>>A>>B;    while(cin>>a[++cnt])    {        cin>>b[cnt];        la[cnt]=a[cnt].length();        lb[cnt]=b[cnt].length();    }    Ans=bfs();    if(Ans==-1) printf("NO ANSWER!");    else printf("%d",Ans);    return 0;}
原创粉丝点击