E. Pattern Matching(题意理解+拓扑排序)
生活随笔
收集整理的這篇文章主要介紹了
E. Pattern Matching(题意理解+拓扑排序)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
E. Pattern Matching
首先p[mtj]p[mt_j]p[mtj?]必須能夠匹配所給字符sjs_jsj?,然后把所有能夠匹配的sjs_jsj?的其他模板串也找出來,這些必須放在p[mtj]p[mt_j]p[mtj?]的后面,典型拓?fù)渑判?#xff0c;連邊然后排序即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<bitset> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,int> pli; typedef pair<int,int> pii; //========================================================== const int N=200010; int n,m,k; map<string,int> mp; vector<int> E[N]; // 鄰接表 int d[N]; int main() {//IO;int T=1;//cin>>T;while(T--){cin>>n>>m>>k;for(int i=1;i<=n;i++){string s;cin>>s;mp[s]=i;}bool ok=1;for(int i=1;i<=m;i++){string s;int pos;cin>>s>>pos;if(!ok) break;bool flag=0;for(int j=0;j<1<<k;j++){string t(s);for(int l=0;l<k;l++)if(j>>l&1)t[l]='_';if(mp.count(t)) {if(mp[t]!=pos)E[pos].push_back(mp[t]),d[mp[t]]++;elseflag=1;// 該位置必須能夠匹配}}if(!flag) ok=0;}if(ok){queue<int> q;for(int i=1;i<=n;i++)if(!d[i]) q.push(i);vector<int> ans;while(q.size()){int t=q.front();q.pop();ans.push_back(t);for(auto v:E[t])if(--d[v]==0) q.push(v);}if(ans.size()==n){cout<<"YES\n";for(auto t:ans) cout<<t<<' ';}elsecout<<"NO\n";}elsecout<<"NO\n";}return 0; }心路歷程:
剛開始理解成把原匹配串重排列,然后一一對應(yīng)
字符串匹配?直接暴力枚舉最多24=162^4=1624=16匹配,然后二分匹配隨便搞搞?寫完發(fā)現(xiàn)題意中有一個first匹配,然后發(fā)現(xiàn)理解錯了,然后······重看一遍又寫發(fā)現(xiàn)又看錯了,然后看了看網(wǎng)上題意解釋真的語文水平。。。
總結(jié)
以上是生活随笔為你收集整理的E. Pattern Matching(题意理解+拓扑排序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称索尼第三方游戏策略转变,世嘉和万代
- 下一篇: codeforces1271 D. Po