玄学做法 93pts 求条
查看原帖
玄学做法 93pts 求条
682739
CuteMurasame楼主2024/7/19 11:52
#ifndef ONLINE_JUDGE
#include"word.h"
#endif
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i(a);i<=(b);++i)
#define req(i,a,b) for(int i(a);i>=(b);--i)
using namespace std;
string wds[10001],allvalid[10001],lst,t;
int allvalidnum[10001];
long long w[10001];
int vis[10001];
int ns;
mt19937 rnd(time(0));
int iv[27]={},ps,sz,vl[27],vv[27];
int cnt[27]={},ap[27],pr[27];
long long w3[10001];
int GOLD[5],SILVER[27];
vector<int> forbidpos[27];
const string first_guess[26]={"slier","lares","lares","tores","tarns","arles","lares","lares","snare","ousel","ranis","nares","tares","aides","tries","lares","raise","aides","plate","nares","snare","riles","nares","cones","kanes","aeons"};
const int fp[26]={7009,4224,4224,7898,7615,383,4224,4224,7078,5407,6132,5086,7613,148,7974,4224,6105,148,5748,5086,7078,6347,5086,1561,3972,99};
const char *guess(int num_testcase, int remaining_guesses, char initial_letter, bool *gold, bool *silver)
{
	if(remaining_guesses==5)
	{
		memset(vis,0,sizeof vis),memset(iv,0,sizeof iv),memset(vv,0,sizeof vv),memset(vl,0,sizeof vl),memset(GOLD,0,sizeof GOLD),memset(SILVER,0,sizeof SILVER);
		rep(i,0,25) forbidpos[i].clear();
		lst=first_guess[initial_letter-97];
		vis[fp[initial_letter-97]]=1;
		return first_guess[initial_letter-97].c_str();
	}
	rep(i,0,4) if(gold[i]) GOLD[i]=lst[i];
	rep(i,0,4) if(silver[i])
	{
		SILVER[lst[i]-97]=1;
		forbidpos[lst[i]-97].emplace_back(i);
	}
	rep(i,1,sz) allvalid[i]="",allvalidnum[i]=0,w[i]=0;
	sz=0;
	t="     ";t[0]=initial_letter;
	ps=lower_bound(wds+1,wds+ns+1,t)-wds;
	memset(ap,0,sizeof ap);
	memset(pr,0,sizeof pr);
	rep(i,0,4)
	{
		pr[lst[i]-97]=1;
		if(gold[i]) ++ap[lst[i]-97],vl[lst[i]-97]=vv[lst[i]-97]=1;
		if(silver[i]) ++ap[lst[i]-97],vl[lst[i]-97]=1;
	}
	rep(i,0,25) if(!ap[i]&&pr[i]) iv[i]=1;
	while(wds[ps][0]==initial_letter)
	{
		int ok=1;
		if(!vis[ps])
		{
			rep(i,0,4) if(iv[wds[ps][i]-97]){ok=0;break;}
			if(ok)
			{
				rep(i,0,4) if(GOLD[i]==wds[ps][i]);else if(GOLD[i]){ok=0;break;}
				if(ok)
				{
					memset(cnt,0,sizeof cnt);
					rep(i,0,26) if(SILVER[i]) cnt[i]=1;
					rep(i,0,4) if(cnt[wds[ps][i]-97]) --cnt[wds[ps][i]-97];
					rep(i,0,26) if(cnt[i]) {ok=0;break;}
					if(ok)
					{
						rep(i,0,4)
						{
							for(auto x:forbidpos[wds[ps][i]-97]) if(x==i){ok=0;break;}
							if(!ok) break;
						}
					}
				}
			}
		}
		else ok=0;
		if(ok)
		{
	//		cout<<ps<<" "<<sz<<" "<<wds[ps]<<" "<<allvalid[sz]<<endl;
			allvalid[++sz]=wds[ps];
			allvalidnum[sz]=ps;
	//		if(rnd()%100<10)return lst=wds[ps],wds[ps].c_str();
	//		cout<<ps<<endl;
		}
		++ps;
//		cout<<ps<<" "<<wds[ps][0]<<endl;
	}
	rep(i,1,sz)
	{
	    for(auto x:allvalid[i])
	    {
	        if(!iv[x-97]&&!vl[x-97])
	        {
	            rep(j,1,sz) if(allvalid[j].find(x)!=-1) w[i]+=10;
	        }
	    }
	    w[i]+=20;
	}
	memset(w3,0,sizeof w3);
	rep(i,1,ns)
	{
		for(auto x:wds[i])
		{
		    if(!iv[x-97]&&!vl[x-97])
		    {
		        rep(j,1,sz) if(allvalid[j].find(x)!=-1) w3[i]+=10;
		    }
		}
	}
	long long T=1,mxw=w[1],tp=1;
	rep(i,2,sz) if(w[i]>mxw) mxw=w[i],T=i;
	if(remaining_guesses==3) rep(i,1,ns) if(w3[i]>mxw) mxw=w3[i],T=i,tp=2;
	if(tp==1)
	{
	    vis[allvalidnum[T]]=1;
	    lst=allvalid[T];
	    return allvalid[T].c_str();
	}
	else
	{
	    vis[T]=1;
	    lst=wds[T];
	    return lst.c_str();
	}
}
void init(int num_scramble, const char *scramble)
{
	ns=num_scramble;
	rep(i,1,num_scramble)
	{
		wds[i]="";
		int psl=i*5-5,psr=psl+4;
		rep(ps,psl,psr) wds[i]+=scramble[ps];
	}
	wds[ns+1]="!!!!!";
}
2024/7/19 11:52
加载中...