首先把trie的廣義字尾自動機建出來,那麼任選起點在trie上走就是在sam 的起點開始走。在sam上求出sg函式,先手必勝當且僅當兩個自動機上的節點的sg函式值不同。對第乙個sam的每個節點求出它在第二個sam上對應的合法的路徑條數【注意是路徑條數,不是節點個數】,然後按照求字典序k小的方法dfs就可以了。
注意幾個細節:
1.後繼狀態總數會爆long long,但是顯然總數只需要存到
k 。
2.乙個點可能有好幾條字母相同的出邊,也就是其實給的不是trie。
#include
#include
#include
using namespace std;
#define ll long long
const int maxn=500010;
int trans[maxn][26],fail[maxn],val[maxn],sg[maxn],trie[maxn][26],rt[2],
que[maxn],id[maxn],cnt[maxn],ord[2][maxn],vis[30],corr[maxn],
n[2],t1[2],tot;
ll size[maxn],sum[maxn],num[maxn][30],k;
int add(int x,int u,int fl)
if (!u) fail[nu]=rt[fl];
else}}
return nu;
}void build(int fl)
id[0]=rt[fl]=++tot;
que[hd=tl=1]=0;
while (hd<=tl)
}for (int i=0;i<=n[fl];i++) cnt[i]=0;
for (int i=rt[fl];i<=tot;i++) cnt[val[i]]++;
for (int i=1;i<=n[fl];i++) cnt[i]+=cnt[i-1];
for (int i=rt[fl];i<=tot;i++) ord[fl][cnt[val[i]]--]=i;
t1[fl]=tot-rt[fl]+1;
for (int i=t1[fl];i>=1;i--)}}
void dfs(int fl,int u,ll k)
dfs(1,rt[1],k);
return;
}k-=size[u];
for (int j=1;j<=26;j++)
if (sum[trans[u][j]]>=k)
else k-=sum[trans[u][j]];
}int main()
for (int i=t1[0];i>=1;i--)
}if (k>sum[1])
dfs(0,1,k);
}
那些年我們office 那些年我們一起吃過的桑葉泡
五一放假,和弟弟一起回了老家,回家之後立馬拿著小籃子出門,去尋覓讓我心心念念的桑葉泡,這個季節正是它們成熟的時候。桑葉泡是我們家這邊的叫法,其實它還有很多的別稱,比如桑葚 桑椹 桑椹子 桑蔗 桑棗 桑果 桑泡兒,桑椹等其性味甘寒,具有補肝益腎 生津潤燥 烏髮明目 利尿保健 消暑等功效。但我們吃它並不...
《那些年,我們一起追的女孩》 他們台灣那些年
此片能在大陸上映,刪減是難免的。其實本片在台灣報批時,一開始主管單位也連續幾次都給出了 限制級 的評定,最後,編劇兼導演九把刀親自登門做工作,才得以 輔導級 登堂入室 而在香港和澳門公映時,也被認定為僅次於 片的 iib 級 在馬來西亞和新加坡,則乾脆是 和16禁 放在沒有分級制的大陸,大動剪刀,必...
那些年我們一起清除的浮動
方法一 after main warp自己閉合浮動了,所以footer不用再清除浮動了 float left side 我也浮動了 float left 為了建立跨瀏覽器相容的同樣的盒模型布局,我們可以把原來的清除浮動的方法改良一下,採用偽類 before 和 after clearfix befo...