noip模擬79(拉格朗日待補)
阿新 • • 發佈:2021-10-17
「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
拉格朗日插值,鴿了.