记录编号 148041 评测结果 AAAAAAAA
题目名称 [NOIP 2002]字串变换 最终得分 100
用户昵称 Gravataralbertxwz 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2015-02-06 13:56:02 内存使用 0.31 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<map>
#include<string>
#include<queue>
#define LOCAL
using namespace std;

typedef struct{
	string s;
	int num;
}point;

map<string,int> m1,m2;
queue<point> q1,q2;
string change[6][2];
point s1,s2;
int k=0,ans;

string become(string now,int pos,int n,string tmp){
	return now.replace(pos,n,tmp);
}

bool dbfs(){
	while(!q1.empty()&&!q2.empty()){
		s1=q1.front();
		int len=s1.s.length();
		for(int i=0;i<len;i++)
			for(int j=0;j<k;j++){
				int tmp=change[j][0].length();
				if(i+tmp-1<len&&!s1.s.compare(i,tmp,change[j][0])&&!m1.count(become(s1.s,i,tmp,change[j][1]))){
					s2.s=become(s1.s,i,tmp,change[j][1]);
					s2.num=q1.front().num+1;
					if(s2.num>10)return false;
					m1[s2.s]=s2.num;
					q1.push(s2);
					if(m2.count(s2.s)){
						ans=s2.num+m2[s2.s];
						return true;
					}
				}
			}
		q1.pop();
		s1=q2.front();
		len=s1.s.length();
		for(int i=0;i<len;i++)
			for(int j=0;j<k;j++){
				int tmp=change[j][1].length();
				if(i+tmp-1<len&&!s1.s.compare(i,tmp,change[j][1])&&!m2.count(become(s1.s,i,tmp,change[j][0]))){
					s2.s=become(s1.s,i,tmp,change[j][0]);
					s2.num=q2.front().num+1;
					if(s2.num>10)return false;
					m2[s2.s]=s2.num;
					q2.push(s2);
					if(m1.count(s2.s)){
						ans=s2.num+m1[s2.s];
						return true;
					}
				}
			}
		q2.pop();
	}
	return false;
}

int main(){
#ifdef LOCAL
	freopen("string.in","r",stdin);
	freopen("string.out","w",stdout);
#endif
	cin>>s1.s>>s2.s;
	if(s1.s==s2.s){
		cout<<0<<endl;
		return 0;
	}
	s1.num=s2.num=0;
	q1.push(s1);
	q2.push(s2);
	m1[s1.s]=0;
	m2[s2.s]=0;
	while(cin>>change[k][0]>>change[k][1])k++;
	if(dbfs())cout<<ans<<endl;
	else printf("NO ANSWER!");
	return 0;
}