日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 6086 -- Rikka with String(AC自动机 + 状压DP)

發布時間:2023/12/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 6086 -- Rikka with String(AC自动机 + 状压DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

?

Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:

Yuta has?n?01?strings?si, and he wants to know the number of?01?antisymmetric strings of length?2L?which contain all given strings?si?as continuous substrings.

A?01?string?s?is antisymmetric if and only if?s[i]s[|s|?i+1]?for all?i[1,|s|].

It is too difficult for Rikka. Can you help her?

In the second sample, the strings which satisfy all the restrictions are?000111,001011,011001,100110.

?

Input The first line contains a number?t(1t5), the number of the testcases.?

For each testcase, the first line contains two numbers?n,L(1n6,1L100).?

Then?n?lines follow, each line contains a?01?string?si(1|si|20).

?

Output For each testcase, print a single line with a single number -- the answer modulo 998244353.

?

Sample Input 2 2 2 011 001 2 3 011 001

?

Sample Output 1 4 題意:反對稱:對于一個長為2*N的串s[0~2*N-1],s[i]^s[2*N-1-i]=1 。現在有n個01串,求有多少個長為2*L的并且包含這n個串的?反對稱01串? 思路:對于一個串包含在2*L的01串中,那么這個串要么在2*L的前半部分,要么后半部分,或者跨越中間,如果在后半部分,則需要找到其在前半部分的反對稱01串,對于跨越中間的01串,則需要找到其在前面部分的串,例如:0 | 11,以豎線作為串中間,那么如果前面部分如果以00結束,那么一定含有 011這個串。把每個串的所有形式放入AC自動機對應的tire樹中,然后狀壓遞推。 代碼如下: #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <queue> #include <string> using namespace std; const int mod=998244353; const int N=2005; struct Node{int id;Node *fail;Node *son[2];int tag1,tag2; }node[N]; queue<Node *>q; int tot; int dp[2][2005][64];void insert1(string s,int id) {int len=s.length();Node *now=&node[0];for(int i=0;i<len;i++){int x=s[i]-'0';if(now->son[x]==NULL) now->son[x]=&node[tot++];now=now->son[x];}now->tag1|=(1<<id); } void insert2(string s,int id) {int len=s.length();Node *now=&node[0];for(int i=0;i<len;i++){int x=s[i]-'0';if(now->son[x]==NULL) now->son[x]=&node[tot++];now=now->son[x];}now->tag2|=(1<<id); } void init() {for(int i=0;i<N;i++){node[i].id=i;node[i].fail=NULL;node[i].son[0]=node[i].son[1]=NULL;node[i].tag1=node[i].tag2=0;} } void setFail() {Node* root=&node[0];q.push(root);while(!q.empty()){Node* now=q.front(); q.pop();for(int i=0;i<2;i++){if(now->son[i]){Node* p=now->fail;while(p && (!(p->son[i]))) p=p->fail;now->son[i]->fail=(p)?(p->son[i]):(root);now->son[i]->tag1|=now->son[i]->fail->tag1;now->son[i]->tag2|=now->son[i]->fail->tag2;q.push(now->son[i]);}else now->son[i]=(now!=root)?now->fail->son[i]:(root);}} } void print() {Node* now=&node[0];queue<Node*>qq;qq.push(now);while(!qq.empty()){now=qq.front(); qq.pop();cout<<"Y:"<<now->id<<" ";for(int i=0;i<2;i++){if(now->son[i]) qq.push(now->son[i]),cout<<now->son[i]->id<<" ";else cout<<"NULL"<<" ";}cout<<endl;} } int main() {///cout << "Hello world!" << endl; int t; cin>>t;while(t--){init();tot=1;int n,L; scanf("%d%d",&n,&L);for(int i=0;i<n;i++){string s; cin>>s;insert1(s,i);string t=s;reverse(t.begin(),t.end());int len=s.length();for(int j=0;j<len;j++)t[j]=(char)((t[j]-'0')^1+'0');insert1(t,i);int mnLen=min(len,L);for(int j=0;j<mnLen;j++){int f=1;for(int l=j,r=j+1; l>=0&&r<len; l--,r++){if((s[l]^s[r])==0) { f=0; break; }}if(!f) continue;t=s.substr(0,j+1);for(int k=2*j+2;k<len;k++){t=(char)((s[k]-'0')^1+'0')+t;}insert2(t,i);}}///print(); setFail();memset(dp,0,sizeof(dp));dp[0][0][0]=1;int cn=0,stu=(1<<n);for(int i=0;i<L;i++){int c=cn^1;memset(dp[c],0,sizeof(dp[c]));for(int j=0;j<tot;j++){for(int s=0;s<stu;s++){if(!dp[cn][j][s]) continue;if(i<L-1)for(int k=0;k<2;k++){int x=node[j].son[k]->id;int tag=node[x].tag1;dp[c][x][s|tag]=(dp[c][x][s|tag]+dp[cn][j][s])%mod;}elsefor(int k=0;k<2;k++){int x=node[j].son[k]->id;int tag=node[x].tag1|node[x].tag2;dp[c][x][s|tag]=(dp[c][x][s|tag]+dp[cn][j][s])%mod;}}}cn=c;}int ans=0;for(int i=0;i<tot;i++){ans=(ans+dp[cn][i][stu-1])%mod;}printf("%d\n",ans);}return 0; }

?

?

轉載于:https://www.cnblogs.com/chen9510/p/7406636.html

總結

以上是生活随笔為你收集整理的hdu 6086 -- Rikka with String(AC自动机 + 状压DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产亚洲欧美一区二区三区 | 污视频在线 | 另类视频在线观看+1080p | 成人区人妻精品一区二区网站 | 四虎一国产精品一区二区影院 | 青青操国产 | 亚洲一区二区免费看 | 国产在线999| 欧美国产不卡 | 在线免费观看一级片 | 美女插插视频 | 日韩在线视频一区 | 91精品欧美一区二区三区 | 看毛片视频 | 午夜精品久久久久久久第一页按摩 | www.99re7.com | 日韩av影视大全 | 精品国产一区二区不卡 | 五月婷婷激情综合 | 欧美男人操女人 | 久久伊人影视 | 日韩精品一区在线 | 麻豆三级在线观看 | 在线观看你懂的网站 | 国产欧美日韩专区发布 | 18av在线视频 | 九九久视频 | 成年男女免费视频网站 | 中文国产视频 | av小次郎收藏 | 成人h片在线观看 | 国产在线观看免费视频今夜 | 三上悠亚影音先锋 | 亚洲三级在线观看 | 国产特黄大片aaaa毛片 | 人人爽人人爽人人片av | 色噜噜一区二区三区 | 高h捆绑拘束调教小说 | 日日干夜夜操 | 99精品人妻无码专区在线视频区 | 日本欧美国产在线 | 欧美老熟 | 欧美日本一道 | 精品一区二区三区无码视频 | 在线观看中文字幕av | 少妇精品亚洲一区二区成人 | 欧美精品一级在线观看 | 三级国产在线观看 | 岛国精品资源网站 | 久久久久婷 | 神马午夜电影一区二区三区在线观看 | 免费av播放| 男人插入女人阴道视频 | 91精品视频在线免费观看 | 制服av网| 中文字幕视频 | 日本香蕉视频 | 在线播放国产视频 | 99色这里只有精品 | xxxxxx欧美 | 亚洲精品合集 | 快播91 | 一区二区三区在线免费观看 | 国产精品大屁股白浆一区 | 六月色| 欧美精品一区二区在线观看 | 丰满大乳奶做爰ⅹxx视频 | 金鱼妻日剧免费观看完整版全集 | 欧美成人vr18sexvr | 6080av| 日韩在线一区视频 | 国产视频久久久 | 男女草比视频 | 欧美精品一级片 | 日韩电影一区二区三区四区 | 中文字幕无码精品亚洲35 | 欧美大色网 | 久久久久五月天 | 久久久久99 | 黑人一区二区三区 | 99久久影院 | 激情成人综合 | 亚洲第一a | 加勒比精品 | 色欧美亚洲 | 国产视频网站在线观看 | 国产日视频 | 国产精品亚洲欧美在线播放 | 精品一区二区欧美 | 97视频在线 | 亚洲精品中文无码AV在线播放 | 亚洲综合一区在线观看 | 免费无遮挡在线观看视频网站 | 韩国性猛交╳xxx乱大交 | 台湾swag在线播放 | 日韩高清av | 一区二区视频在线观看 | 日本女优中文字幕 | 韩国主播青草200vip视频 |