HDU 5487 Difference of Languages
这题从昨天下午2点开始做,到现在才AC了。感觉就是好多题都能想出来,就是写完后debug很长时间,才能AC,是不熟练的原因吗?但愿孰能生巧吧。
BFS转移的是两个DFA的状态,用typedef pair<int,int> pi;map<pi,pi> pres; 两步储存前后状态的链接。
附上一组测坑数据:
/*
432
4 3 1
3
0 1 a
1 2 e
2 3 w
6 3 1
5
0 1 a
1 3 e
3 5 h
*/
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <map> #include <queue> #include <vector> using namespace std; int n1,m1,k1; int n2,m2,k2; const int maxn = 1005; int ac1[maxn]; int ac2[maxn]; map<char,int> mp1; map<int,char> mp2; int g1[maxn][30]; int g2[maxn][30]; int vis[maxn][maxn]; typedef pair<int,int> pi; map<pi,pi> pres; int a[maxn][maxn]; int flag = 0; struct edge { int st1,st2; }; edge ans; void pre() { for(int i=1;i<=26;i++) { char c = 'a'+i-1; mp1[c]=i; mp2[i]=c; } } void inin() { for(int i=0;i<maxn;i++) { ac1[i] = 0; ac2[i] = 0; } memset(g1,-1,sizeof(g1)); memset(g2,-1,sizeof(g2)); memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); pres.clear(); } bool check(int u,int c) { if(ac1[u]!=ac2[c]) return false; return true; } void bfs() { queue<edge> q; edge cur; q.push((edge){0,0}); ans = {0,0}; flag = 0; while(!q.empty()) { cur = q.front(); q.pop(); if(!check(cur.st1,cur.st2)) { ans = cur; flag = 1; return; } for(int i=1;i<=26;i++) { int v1 = g1[cur.st1][i]; int v2 = g2[cur.st2][i]; if(!vis[v1][v2]) { vis[v1][v2] = 1; q.push((edge){v1,v2}); pres[pi(v1,v2)] = make_pair(cur.st1,cur.st2); a[v1][v2] = i; } } } } int main() { pre(); int t; int kase = 0; cin>>t; while(t--) { int u,v,x; char c; inin(); cin>>n1>>m1>>k1; for(int i=1;i<=k1;i++) { scanf("%d",&x); ac1[x] = 1; } for(int i=1;i<=m1;i++) { scanf("%d %d %c",&u,&v,&c); g1[u][mp1[c]] = v; } cin>>n2>>m2>>k2; for(int i=1;i<=k2;i++) { scanf("%d",&x); ac2[x] = 1; } for(int i=1;i<=m2;i++) { scanf("%d %d %c",&u,&v,&c); g2[u][mp1[c]] = v; } g1[0][0] = 0; g2[0][0] = 0; for(int i=0;i<=n1;i++) //下面两步是防止 最后ac1[u]和ac2[c]索引为负。 for(int j=1;j<=26;j++) if(g1[i][j]==-1) g1[i][j]=n1; for(int i=0;i<=n2;i++) for(int j=1;j<=26;j++) if(g2[i][j]==-1) g2[i][j]=n2; bfs(); printf("Case #%d: ",++kase); if(!flag) { printf("0 "); continue; } vector<int> buffer; pi cur; while(pres.count(pi(ans.st1,ans.st2))&&(ans.st1!=0||ans.st2!=0)) { buffer.push_back(a[ans.st1][ans.st2]); cur = pres[pi(ans.st1,ans.st2)]; ans.st1 = cur.first; ans.st2 = cur.second; } reverse(buffer.begin(),buffer.end()); for(int i=0;i<buffer.size();i++) { printf("%c",buffer[i]+'a'-1); } printf(" "); } return 0; } /* 432 4 3 1 3 0 1 a 1 2 e 2 3 w 6 3 1 5 0 1 a 1 3 e 3 5 h */