1 条题解

  • 0
    @ 2025-10-8 16:54:03
    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
    	char s[110];
    	int len, dep, kt;
    	node()
    	{
    		len=dep=0;
    	}
    } tx[10], ty[10];
    deque<node> Q;  map<int, bool> v;
    int kangtuo(node no) //给每个状态一个唯一的编号(康托值) 
    {
    	int sum=0; 
    	for(int i=1; i<=no.len; i++) sum=(sum*29+no.s[i])%1000003;
    	return sum;
    }
    bool check(node no, int st, int p) //检查 tx中是否有以 st为开头的子串可以用p的方式替换 
    {
    	for(int i=1; i<=tx[p].len; i++) if(no.s[st+i-1]!=tx[p].s[i]) return 0;
    	return 1;
    }
    node change(node no, int st, int p) //x中以st为开头的子串用 p的方式替换  
    {
    	node tno; int t=0;
    	for(int i=1; i<st; i++)                 tno.s[++t]=no.s[i]; //拷贝前面的部分 
    	for(int i=1; i<=ty[p].len; i++)         tno.s[++t]=ty[p].s[i]; //用ty替代 
    	for(int i=st+tx[p].len; i<=no.len; i++) tno.s[++t]=no.s[i]; //拷贝后面的部分 
    	tno.s[t+1]='\0'; tno.len=t;
    	tno.dep=no.dep+1; tno.kt=kangtuo(tno);
    	return tno;
    }
    int main()
    {
    	node stno, edno;
    	scanf("%s%s", stno.s+1, edno.s+1);
    	stno.len=strlen(stno.s+1);
    	edno.len=strlen(edno.s+1);
    	stno.dep=0; stno.kt=kangtuo(stno);
    	edno.kt=kangtuo(edno);
    	
    	int n; scanf("%d", &n);
    	for(int i=1; i<=n; i++)
    	{
    		scanf("%s%s", tx[i].s+1, ty[i].s+1);
    		tx[i].len=strlen(tx[i].s+1);
    		ty[i].len=strlen(ty[i].s+1);
    	}
    	
    	Q.clear(); Q.push_back(stno);
    	v.clear(); v[stno.kt]=1;  //去重
    	while(!Q.empty()) //开始宽搜
    	{
    		node no=Q.front(); Q.pop_front();
    		if(no.dep>=10) break;  //不超过10步
    		for(int i=1; i<=no.len; i++)  //枚举no的每个可能被替换的开始位置
    		{
    			for(int j=1; j<=n; j++) if(i+tx[j].len-1<=no.len) //第j种替换方式 
    			{
    				if(check(no, i, j)) //能替换 
    				{
    					node tno=change(no, i, j); //替换后产生新状态 
    					if(v[tno.kt]==0)
    					{
    						v[tno.kt]=1; 
    						Q.push_back(tno); //放入队列中 
    						if(tno.kt==edno.kt) {printf("%d\n", tno.dep); return 0;} //是否是目标 
    					}
    				}
    			}
    		}
    	}
    	printf("NO ANSWER!\n");
    	return 0;
    }
    
    • 1

    *【宽搜(难度:S5)】[NOIP 2002 提高组] 字串变换

    信息

    ID
    779
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    80
    已通过
    13
    上传者