<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【題解】Luogu P4045 [JSOI2009] 密碼

      \(dp_{i,j,S}\) 表示填了 \(i\) 位,在 AC 自動機上的 \(j\) 號節點,當前覆蓋的字符串集位 \(S\) 的方案數。于是有轉移:

      \[\large{dp_{i,j,S}\to dp_{i+1,tr_{j,k},S\operatorname{or}sta_{tr_{j,k}}}} \]

      其中 \(tr_{j,k}\) 表示 AC 自動機上 \(j\) 點加上字符 \(k\) 的節點,\(sta_j\) 表示以 \(j\) 點為結尾的字符串構成的集合,\(\operatorname{or}\) 表示按位或。

      輸出方案,先記憶化搜索確定每個狀態 \((i,j,S)\) 能否轉移到合法狀態,再一遍 dfs 輸出即可。

      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      
      using namespace std;
      namespace asbt{
      namespace cplx{bool begin;}
      const int maxn=(1<<10)+5;
      int n,m,tr[105][30],tot;
      int fail[105],sta[105];
      ll dp[30][105][maxn];
      bool vis[30][105][maxn];
      bool f[30][105][maxn];
      char ans[maxn];
      string s;
      queue<int> q;
      il bool dfs1(int i,int j,int S){
      	if(vis[i][j][S]){
      		return f[i][j][S];
      	}
      	vis[i][j][S]=1;
      	if(i==m){
      		return f[i][j][S]=S==(1<<n)-1;
      	}
      	bool &res=f[i][j][S];
      	for(int k=0;k<=25;k++){
      		res|=dfs1(i+1,tr[j][k],S|sta[tr[j][k]]);
      	}
      	return res;
      }
      il void dfs2(int i,int j,int S){
      	if(i==m){
      		for(int k=1;k<=m;k++){
      			cout<<ans[k];
      		}
      		cout<<"\n";
      		return ;
      	}
      	for(int k=0;k<=25;k++){
      		if(f[i+1][tr[j][k]][S|sta[tr[j][k]]]){
      			ans[i+1]=k+'a';
      			dfs2(i+1,tr[j][k],S|sta[tr[j][k]]);
      		}
      	}
      }
      namespace cplx{
      	bool end;
      	il double usdmem(){return (&begin-&end)/1048576.0;}
      }
      int main(){
      	ios::sync_with_stdio(0),cin.tie(0);
      	cin>>m>>n;
      	for(int i=1,p;i<=n;i++){
      		cin>>s;
      		p=0;
      		for(int j=0,d;j<s.size();j++){
      			d=s[j]-'a';
      			if(!tr[p][d]){
      				tr[p][d]=++tot;
      			}
      			p=tr[p][d];
      		}
      		sta[p]|=1<<(i-1);
      	}
      	for(int i=0;i<=25;i++){
      		if(tr[0][i]){
      			q.push(tr[0][i]);
      		}
      	}
      	while(q.size()){
      		int u=q.front();
      		q.pop();
      		for(int i=0;i<=25;i++){
      			if(tr[u][i]){
      				fail[tr[u][i]]=tr[fail[u]][i];
      				sta[tr[u][i]]|=sta[fail[tr[u][i]]];
      				q.push(tr[u][i]);
      			}
      			else{
      				tr[u][i]=tr[fail[u]][i];
      			}
      		}
      	}
      	dp[0][0][0]=1;
      	for(int i=0;i<=m;i++){
      		for(int j=0;j<=tot;j++){
      			for(int S=0;S<1<<n;S++){
      				if(!dp[i][j][S]){
      					continue;
      				}
      				for(int k=0;k<=25;k++){
      					dp[i+1][tr[j][k]][S|sta[tr[j][k]]]+=dp[i][j][S];
      				}
      			}
      		}
      	}
      	ll ans=0;
      	for(int i=0;i<=tot;i++){
      		ans+=dp[m][i][(1<<n)-1];
      	}
      	cout<<ans<<"\n";
      	if(ans>42){
      		return 0;
      	}
      	dfs1(0,0,0);
      	dfs2(0,0,0);
      	return 0;
      }
      }
      int main(){return asbt::main();}
      
      posted @ 2025-02-06 16:24  zhangxy__hp  閱讀(20)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 好男人社区在线www| 无码AV中文字幕久久专区| 少妇人妻偷人精品系列| 亚洲精品一区二区妖精| 一区二区三区精品自拍视频| 国产高清无遮挡内容丰富| 东丰县| 精品视频一区二区福利午夜| 九九久久精品国产| 国产视频不卡一区二区三区| 起碰免费公开97在线视频| 少妇无套内谢免费视频| 亚洲精品中文av在线| 亚洲欧洲日韩国内高清| 丝袜a∨在线一区二区三区不卡 | 白嫩少妇无套内谢视频| 高清中文字幕国产精品| 人妻换着玩又刺激又爽| 粗大挺进朋友人妻淑娟| 成人国产精品一区二区不卡| 國產尤物AV尤物在線觀看| 国产无遮挡免费真人视频在线观看| 男女裸体影院高潮| 久久亚洲精品情侣| 久久精品日日躁夜夜躁| 亚洲第一精品一二三区| 日韩区二区三区中文字幕| 成人白浆一区二区三区在线观看| 麻豆文化传媒精品一区观看| 亚洲精品一区二区三区在线观看| 亚洲熟妇中文字幕五十路| 強壮公弄得我次次高潮A片| 亚洲精品日韩在线观看| 四虎永久在线精品免费看| 亚洲欧洲日产国码久在线| 久久人人爽爽人人爽人人片av | 无码日韩精品一区二区三区免费| 国产亚洲精品成人aa片新蒲金| 国产亚洲999精品AA片在线爽| 好硬好湿好爽好深视频| 精品亚洲无人区一区二区|