1. 程式人生 > 其它 >noip模擬79(拉格朗日待補)

noip模擬79(拉格朗日待補)

「F·S·華容道·O」

A. F

簽到題,然而我死了,自己想得太複雜.

A_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
	#define ll long long 
	#define ull unsigned ll
	#define lf double
	#define lbt(x) ((x)&(-(x)))
	#define mp(x,y) make_pair(x,y)
	#define lb lower_bound 
	#define ub upper_bound
	#define Fill(x,y) memset(x,y,sizeof x)
	#define Copy(x,y) memcpy(x,y,sizeof x)
	#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
	inline ll read() {
		ll w=0; bool cit=1; char ch;
		while(!isdigit(ch=getchar())) if(ch=='-') cit=0; 
		while(isdigit(ch)) w=(w<<3)+(w<<1)+(ch^48),ch=getchar();
		return cit?w:-w;
	}
} using namespace BSS;

const ll N=1e3+21,mod=998244353;

ll m,n,ts,ans,cnt;
ll vis[N],head[N];
bitset<N> bit[N];
struct I { ll u,v,nxt; } e[N*N];
auto add=[](ll u,ll v)->void{
	e[++ts].u=u,e[ts].v=v,e[ts].nxt=head[u];
	head[u]=ts;
};
auto ksm=[](ll a,ll b,ll c)->ll{
	ll w=1; a%=c;
	for(;b;b>>=1,a=a*a%c) if(b&1) w=w*a%c;
	return w%c;
};
void bfs(){
	queue<ll> que; ll u,v;
	for(ll i=1;i<=n;i++) que.push(i),vis[i]=1;
	while(que.size()){
		u=que.front(),que.pop();
		for(ll i=head[u];i;i=e[i].nxt){
			if((bit[v=e[i].v]&bit[u])==bit[u]) continue;
			bit[v]|=bit[u];
			if(!vis[v]) que.push(v);
			vis[v]=1;
		}
		vis[u]=0;
	}
}
signed main(){
	File(f);
	n=read(); char ch[N]; ll u,v,tmp;
	for(ll i=1;i<=n;i++){
		scanf("%s",ch+1); bit[i].set(i,1);
		for(ll j=1;j<=n;j++) if(ch[j]=='1') bit[j].set(i,1),add(i,j);
	}
	bfs();
	for(ll i=1;i<=n;i++){
		ans=(ans+ksm(bit[i].count(),mod-2,mod))%mod;
	}
	printf("%lld\n",ans),exit(0);
}

B. S

\(Kmp\) 自動機的模板題.

B_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
	#define ll int 
	#define ull unsigned ll
	#define lf double
	#define lbt(x) ((x)&(-(x)))
	#define mp(x,y) make_pair(x,y)
	#define lb lower_bound 
	#define ub upper_bound
	#define Fill(x,y) memset(x,y,sizeof x)
	#define Copy(x,y) memcpy(x,y,sizeof x)
	#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
	inline ll read() {
		ll w=0; bool cit=1; char ch;
		while(!isdigit(ch=getchar())) if(ch=='-') cit=0; 
		while(isdigit(ch)) w=(w<<3)+(w<<1)+(ch^48),ch=getchar();
		return cit?w:-w;
	}
} using namespace BSS;

const ll N=8e3+21;

char ch[N];

ll m,n,ans;
ll s[N],t[N],fail[N],jmp[N];
ll f[N][N],nxt[N][27];
inline void ckmin(ll &x,ll y){ x=min(x,y); };
signed main(){
	File(s);
	ans=1e8;
	scanf("%s",ch+1),n=strlen(ch+1);
	for(ll i=1;i<=n;i++) s[i]=ch[i]-'a'+1;
	scanf("%s",ch+1),m=strlen(ch+1);
	for(ll i=1;i<=n;i++) t[i]=ch[i]-'a'+1;
	for(ll i=2,j=0;i<=n;i++){
		while(j and t[i]!=t[j+1]) j=fail[j];
		j+=(t[i]==t[j+1]),fail[i]=j;
	}
	for(ll i=0;i<=m;i++){
		for(ll j=1;j<=26;j++)
			nxt[i][j]= (t[i+1]==j ? (i+1) : nxt[fail[i]][j]);
	}
	Fill(f,0x3f); ll x; f[0][0]=0;
	for(ll i=0;i<n;i++){
		for(ll j=0;j<m;j++){			
			ckmin(f[i+1][j],f[i][j]+1),ckmin(f[i+1][nxt[j][s[i+1]]],f[i][j]);
		}
	}
	for(ll i=0;i<m;i++) ans=min(ans,f[n][i]);			
	printf("%d\n",ans),exit(0);
}

C.「NOIP2013」華容道

D. O

拉格朗日插值,鴿了.