记录编号 |
104290 |
评测结果 |
AAAAAAA |
题目名称 |
[HAOI 2005]破译密文 |
最终得分 |
100 |
用户昵称 |
ztx |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.002 s |
提交时间 |
2014-06-04 18:20:27 |
内存使用 |
0.34 MiB |
显示代码纯文本
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <cstdlib>
- #include <queue>
-
- using namespace std;
-
- string s1 , s2;
- int sig[2]={2601,2602};
- int data1 [ 2601 ] = { 0 } , data2 [ 2601 ] = { 0 };
- int father [ 2601 + 1 ] = { 0 };
- int word [ 26 ] = { 0 };
- int ans = 1;
- bool f [ 2602 ] = { 0 };
-
- void In();
- void Out();
- void Union(int x,int y);
- int Find(int x);
-
- int main()
- {
- freopen("encrypt.in","r",stdin);
- freopen("encrypt.out","w",stdout);
- In();
- Out();
- return 0;
- }
-
- void In()
- {
- char ch;
- int t = 0;
- cin >> s1 >> s2;
- cin >> t;
- while ( t -- )
- {
- cin >> ch;
- cin >> word [ ch - 'a' ];
- }
- for (int i = 0;i < s1.size();i ++ )
- {
- ch = s1[ i ];
- if (ch == '0' || ch == '1')
- data1 [ ++ data1 [ 0 ] ] = sig[ch-'0'];
- else
- {
- t = ch - 'a';
- for (int j = 1;j <= word [ t ];j ++ )
- data1 [ ++ data1 [ 0 ] ] = t * 100 + j;
- }
- }
- for (int i = 0;i < s2.size();i ++ )
- {
- ch = s2[ i ];
- if (ch == '0' || ch == '1')
- data2 [ ++ data2 [ 0 ] ] = sig[ch-'0'];
- else
- {
- t = ch - 'a';
- for (int j = 1;j <= word [ t ];j ++ )
- data2 [ ++ data2 [ 0 ] ] = t * 100 + j;
- }
- }
- }
-
- void Out()
- {
- father [sig[0]]=sig[0];
- father [sig[1]]=sig[1];
- if ( data1 [ 0 ] != data2 [ 0 ])
- {
- cout << "0" << endl;
- return;
- }
- for ( int i = 1;i <= data1 [ 0 ];i ++ )
- {
- Union(data1 [ i ],data2 [ i ]);
- }
- for ( int i = 1;i <= data1 [ 0 ];i ++ )
- {
- int r = Find(data1 [ i ]);
- if ( r != sig[1] && r != sig[0] && ! f [ r ])
- {
- ans *= 2;
- f [ r ] = true;
- }
- }
- cout << ans << endl;
- }
-
- void Union(int x,int y)
- {
- int r1 = Find(x);
- int r2 = Find(y);
- if (r1 == sig[0] && r2 == sig[1])
- {
- cout<<0<<endl;
- exit(0);
- }
- if (r1 == sig[1] && r2 == sig[0])
- {
- cout<<0<<endl;
- exit(0);
- }
- if ( r1 == r2) return ;
- if ( r1 > r2 ) father [ r2 ] = r1;
- else if ( r1 < r2 ) father [ r1 ] = r2;
- }
-
- int Find(int x)
- {
- if ( father [ x ] == sig[0] || father[x] == sig[1]) return father[x];
- if ( father [ x ] == 0 || father [ x ] == x )
- {
- father [ x ] = x;
- return x;
- }
- father [ x ] = Find( father [ x ] );
- return father [ x ];
- }