G(x)

  思路:

  首先搞清楚每个位置上的值有什么意义, 如果第i位的值为1则 第i位与第i+1位不同,反之相同.

  然后考虑s1和s2为什么会不一样, 这是由于x+1后比特位进位导致的,于是得出一个性质:

    如果进位最高在第i位, 则

     x的[0,i-1]位为1;

    x+1的[0,i-1]位为0;

    x/x+1 在[i+1,n]位置的值相同

  同时可以确定G(x)大部分位置的情况.

  最后大概是这样:

           bn  bn-1  ...  bi+1  bi  bi-1  bi-2  ...  b1  

  x                      1    0    0   ...  0 

  x+1                      0    1    1  ...  1

  G(x)                    k    1    0

  G(x+1)                   1-k   1    0  ...  0

  所以做法就是枚举最后的进位,然后根据 自由的"??"来统计了.

  细节比较多:

  1. i前面的s1,s2要能够保证相同;

  2. G()中[i,n]区间 1 的个数要保证能使得 x 的第i位为1 和 (x+1) 的第i位为0 , 讨论奇偶性,并利用自由的'?';

  3. k=1的情况 不能在第n位出现, 这是为了保证 x<x+1.

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <queue>
  5. #include <iostream>
  6. #include <string>
  7. #include <ctime>
  8. #include <algorithm>
  9. #include <cmath>
  10. #include <ctime>
  11. using namespace std;
  12. #define maxn 100010
  13. typedef long long llong;
  14. const llong mod = ;
  15. char g1[maxn],g2[maxn];
  16. int ww[maxn],w1[maxn],ueql[maxn],all1[maxn];
  17. llong f[][maxn];
  18. void pretreat()
  19. {
  20. int i,len;
  21. len = strlen(g1);
  22. memset(ww,,sizeof(ww));
  23. memset(w1,,sizeof(w1));
  24. memset(ueql,,sizeof(ueql));
  25. memset(all1,,sizeof(all1));
  26.  
  27. for ( i= ; i<len ; i++ )
  28. {
  29. if (g1[i]=='?'&&g2[i]=='?') ww[i]=;
  30. else if (g1[i]==''&&g2[i]=='') all1[i]=;
  31. else if ((g1[i]=='?'&&g2[i]=='') || (g1[i]==''&&g2[i]=='?')) w1[i]=;
  32. else if ((g1[i]==''&&g2[i]=='') || (g1[i]==''&&g2[i]=='')) ueql[i]=;
  33. }
  34.  
  35. for ( i= ; i<len ; i++ )
  36. {
  37. ww[i] += ww[i-];
  38. w1[i] += w1[i-];
  39. all1[i] += all1[i-];
  40. ueql[i] += ueql[i-];
  41. }
  42. }
  43.  
  44. bool can(int pos,int len)
  45. {
  46. int cnt1;
  47. if (g1[pos]==''&&g2[pos]=='') return false;
  48. if (g1[pos]==''&&g2[pos]=='') return false;
  49. if (pos+<len&&(g1[pos+]=='' || g2[pos+]=='')) return false;
  50. if (pos->=&&ueql[pos-]) return false;
  51. if (pos+<len) cnt1 = w1[len-]-w1[pos+]+all1[len-]-all1[pos+]+ueql[len-]-ueql[pos+];
  52. else cnt1 = ;
  53. if (cnt1) return false;
  54. if (pos==len-) return true;
  55. return true;
  56. }
  57.  
  58. void PrintAns(int pos,int k)
  59. {
  60. int i,len,cnt1;
  61. g1[pos]=k+'';
  62. g2[pos]=-k+'';
  63. len = strlen(g1);
  64. if (pos) cnt1 = w1[pos-]+all1[pos-];
  65. else cnt1 = ;
  66. for ( i=len- ; i>pos+ ; i-- ) g1[i]=g2[i]='';
  67. if (pos+<=len-) g1[pos+]=g2[pos+]='';
  68. for ( i= ; i<pos ; i++ )
  69. {
  70. if (g1[i]=='?'&&g2[i]=='') g1[i]='';
  71. if (g1[i]==''&&g2[i]=='?') g2[i]='';
  72. if (g1[i]==''&&g2[i]=='?') g2[i]='';
  73. if (g1[i]=='?'&&g2[i]=='') g1[i]='';
  74. if (g1[i]=='?'&&g2[i]=='?')
  75. {
  76. if (k==)
  77. {
  78. if (cnt1%) g1[i]=g2[i]='';
  79. else g1[i]=g2[i]='';
  80. }else
  81. {
  82. if (cnt1%) g1[i]=g2[i]='';
  83. else g1[i]=g2[i]='';
  84. }
  85. }
  86. }
  87. g1[len]=g2[len]=;
  88. // printf("%s\n%s\n",g1,g2);
  89. cout<<g1<<endl<<g2<<endl;;
  90. }
  91.  
  92. int getvar(int i,int j)
  93. {
  94. if (i== && j>=) return ;
  95. if (i== && j>=) return ;
  96. return f[i][j];
  97. }
  98.  
  99. void solv()
  100. {
  101. int i,flg,pos,len,k,cnt1,cntw;
  102. llong ans=;
  103. len = strlen(g1);
  104. flg = ;
  105. // printf("len=%d\n",len);
  106. // printf("%s\n%s\n",g1,g2);
  107. for ( i= ; i<len ; i++ )
  108. if (can(i,len))
  109. {
  110. // printf("w1[len-1]-w1[pos+1]=%d-%d=%d\n",w1[len-1],w1[i+1],w1[len-1]-w1[i+1]);
  111. if (i) cnt1 = w1[i-] + all1[i-];
  112. else cnt1=;
  113. if (i) cntw = ww[i-];
  114. else cntw=;
  115. // printf("%c %c\n",g1[i],g2[i]);
  116. // printf("i=%d cnt1=%d cntw=%d uneql=%d\n",i,cnt1,cntw,i>0?ueql[i-1]:0);
  117. if (g1[i]!=''&&g2[i]!=''&&i) // k=1
  118. {
  119. if (cnt1%)
  120. {
  121. ans += f[][cntw];
  122. int tmp = getvar(,cntw);
  123. flg += tmp;
  124. if (tmp&&flg==) pos=i,k=;
  125. }else
  126. {
  127. ans += f[][cntw];
  128. int tmp = getvar(,cntw);
  129. flg += tmp;
  130. if (tmp&&flg==) pos=i,k=;
  131. }
  132. }
  133. if (g1[i]!=''&&g2[i]!='') // k=0
  134. {
  135. if (cnt1%)
  136. {
  137. ans += f[][cntw];
  138. int tmp = getvar(,cntw);
  139. flg += tmp;
  140. if (tmp&&flg==) pos=i,k=;
  141. }else
  142. {
  143. ans += f[][cntw];
  144. int tmp = getvar(,cntw);
  145. flg += tmp;
  146. if (tmp&&flg==) pos=i,k=;
  147. }
  148. }
  149. while (ans >= mod) ans -= mod;
  150. }
  151. if (flg>) cout<<"Ambiguous "<<ans<<endl;
  152. else if (flg==) cout<<"Impossible"<<endl;
  153. else PrintAns(pos,k);
  154. }
  155.  
  156. void initDp()
  157. {
  158. int i,j;
  159. f[][] = ;
  160. f[][] = ;
  161. for ( i= ; i<maxn ; i++ )
  162. for ( j= ; j< ; j++ )
  163. {
  164. f[j][i] = f[-j][i-]+f[j][i-];
  165. while (f[j][i]>=mod) f[j][i] -= mod;
  166. }
  167. // for ( i=0 ; i<20 ; i++ ) printf("f[0][%d]=%I64d f[1][%d]=%I64d\n",i,f[0][i],i,f[1][i]);
  168. }
  169.  
  170. int main()
  171. {
  172. int cas,tt=;
  173. freopen("test.txt","r",stdin);
  174. // freopen("my.txt","w",stdout);
  175.  
  176. scanf("%d",&cas);
  177. initDp();
  178. for ( tt= ; tt<=cas ; tt++ )
  179. {
  180. printf("Case #%d:\n",tt);
  181. scanf("%s",g1);
  182. scanf("%s",g2);
  183. pretreat();
  184. solv();
  185. }
  186. return ;
  187. }

几组数据:

23

1?

1?

?

?

1?10

?0?0

110??????0?0?1???0?100??00?0?00000???0??????0?000??0?0?00?00?0??000?000???00000?0?0????0000000?0?0?0??00000??0???0??0??0?000?000?000000?0?0?0??0?000???0000?0?0000?0???????0??0?0?00????00?????0????00??
?1011?11??????1100??0?00?0?0???00????0?00???0000?0??0??0000000?0???0?0???????0?0???0??000??0???????00?00??0?0000??0?0???0?000??????00????0???0???0??000???00?0000?00???000???00????000?000000?0?00000?00
????0?????11?01??10????000??0??0??100??0??1??0?1?0?????010110?1?00??1?0??10????00??0?110?1????01?1????????000???01?110?1??1?01?1??0000???01?0?0111?0111101?010??0111?10?1??0??00?1????????00?????1?110??
?1??00???1?1??10?10?00?0?0??0?10?0?0????0?????0100?0???????1???1001??0011100????01???1???1??010??10110????00???00?0?10?10010?1010?0?0?01????000??1?0?1?1?110??0?011????????????0??10?00?01?0?01???0???11
?010000???????????00???0??00?0???00??000???0??0?0?000?0?0000???0000?0??0????0???0000?00?0?0??00?0?00?00?????0???0?0000?00000?0?000?00?????0??0?0???0?0???0?0??00?????000?0????0?0?0???0???000?00?0????00
?1??00?0000???000?0???0??0?0?0?0???000??00??0000?0??0?00??00?0?00????00000?0????0???000?0?00????0?????0????00??000?00?00??0??0?000?00?00??0000?0??0???0??0???00000???0?0?0??0??0?00???0000??0?0?0????0?0
??1???11?10?????00??0??10?10??1???1?11??0?0?000000??0?000?0??000??0???0????0??0?00???000????000???????000??00?0???00??00?0??0?00???00?0?00??000??000????00???0?00??000??00??00??00??00??0??????0?00???0?
?1??0?1?1?0?1??0000?0?1?001011?????11????11??0?0?0???0000?0?0?0?000000??0??00?????0?????0?0?0???0?000??0?0??00????0??0?0??0?00?0000?0??0?00?0??????0???0?0??0000??000?00?0?0000??0????0?00??0????0000??0
?10?1???0?1?0???????01?11?00?1011?????1?10?11????0?0??1??1?10??1010?011?10??1?0???001???0?1?0?111?1???111?0?1100000??01????1??????0??01110?1111????01??0?01100?????0?00?11?1000000?000?0???0?????0??0000
0?00???1????00?011?1?1?1?10?0?0?1???01?01011?001?0?00??10?0??????101??10?????10??1??110??0?00?11??1??01?1100?1???0010?1??001?1??1?00???110???1?1???0??001?1?00?11010????111??0?00?0???0????0?000????0000
???10??10?10??110??110?0??101?110?010100??001?????0??0?0???????0?0??0?0??????11?1?0?000?????????0??0????????00??1?000?01?1???11?0?0??????1?1?1010?01?0???0??1??1?1?1??0100??1?00??11
???00?1??1??0???11111????10?1??0????1??????1??0????0???10?????????00??1??????1?1?1??0?10?1??000?01??????01010?1??01?00?????000?10??1????????1???1?0?0????0?00?????1???0??1110?0??00?
?01?00???01?????11????10???1?00????00?00001110?1??1????00???1?01?0?00??????????1?0?01??100?0?0?111??0???????0??1??1?0????1?0???01???0?11??????0???0????
?????00????0?0???0???????10?????10??00?10???00???00???10?00?1001???1??0?10??1?1????011??????101????????01?0??10??1??01?0?????????001???0?10???01?011??1
?1?10??1?1?101?????0011??01?1??0??0?0??10???????????0?????1???1?01000?0?00???0??00???11?????0???1???0???1???1?1?0????1????01??0????11011?1?011??1?1?????????1??1?11??11?1?0???1??1?00?01??????????01
1?0?1???01101??11?0010??0???????0?001?1??000???100??1??01?00??111?1?1?1??1??0?10?????1????1???0??????????00??????10???1?1?110111?10?1????00????00?010??????????1??1?00??1001???01?1????00?11????????
???0?????0?001????0?
?????0?10??1?10?1?1?
?0???1???000?1?????0?????01????1?11????0?0???11???1?1??0?1????0??1?0?1??000?010?1????1?????00?1?00?111?111??0??0???0??0001?1???00?1?1?1???1????0???10?????0010?0
00?11???0?00001??????11???11?????10??1???11??01??1??0?1011001?101??01??1?10?10?01?1?1000??1?0??11?0?1????1???01???10?????????01???????0???0??01????001110?10????

2013成都网赛 G(x) (HDU 4733)的更多相关文章

  1. 2013成都网赛1003 hdu 4730 We Love MOE Girls

    题意:有一个字符串,若以"desu"结尾,则将末尾的"desu"替换为"nanodesu",否则在字符串末尾加上"nanodesu ...

  2. 2013成都网赛1010 hdu 4737 A Bit Fun

    题意:定义f(i, j) = ai|ai+1|ai+2| ... | aj (| 指或运算),求有多少对f(i,j)<m.1 <= n <= 100000, 1 <= m &l ...

  3. HDU 4733 G(x) (2013成都网络赛,递推)

    G(x) Time Limit: 2000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  4. HDU 4730 We Love MOE Girls (2013成都网络赛,签到水题)

    We Love MOE Girls Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. HDU 4737 A Bit Fun (2013成都网络赛)

    A Bit Fun Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. HDU 4734 F(x) (2013成都网络赛,数位DP)

    F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. HDU 4731 Minimum palindrome (2013成都网络赛,找规律构造)

    Minimum palindrome Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  8. 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...

  9. HDU 4737 A Bit Fun 2013成都 网络赛 1010

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4737 题目大意:给定一系列数,F(i,j)表示对从ai到aj连续求或运算,(i<=j)求F(i, ...

随机推荐

  1. Oracle Database 12c Using duplicate standby database from active database Created Active DataGuard

    primary database db_name=zwc, db_unique_name=zwc standby database db_name=zwc, db_unique_name=standb ...

  2. DHTML【8】--CSS

    在讲HTML时说过,有个Style标签是在CSS里用的,是的,在HTML中添加CSS样式必须要用到Style,在标签里单独定义标签属性时用的是Style属性.上一节我们也说过,先不用管那个Style标 ...

  3. Android——自定义Actionbar左侧覆盖不全的解决方案

    今天遇到一个很蛋疼的问题,就是在自定义Actionbar的时候,setCustomView中,自定义的view怎么也覆盖不了整个视图,左侧一直留有一个空白,看下图: 所写的部分代码如下: protec ...

  4. (转)iOS7界面设计规范(11) - UI基础 - 图标与图形

    不知别人如何,我自己来讲,平时很习惯很有动力去做的一些事,譬如博客吧,一旦生活中出现一些让自己很难受的状况,就很容易受到影响:像是,你平时所习惯的生活状态都是基于某种东西的,一旦这种东西崩塌,会影响到 ...

  5. HTML5新增的一些属性和功能之六——拖拽事件

    拖放事件的前提是分为源对象和目标对象,你鼠标拖着的是源对象,你要放置的位置是目标对象,区分这两个对象是因为HTML5的拖放事件对两者是不同的. 被拖动的源对象可以触发的事件: 1).ondragsta ...

  6. jQuery中 $ 符号的冲突问题

    jQuery中 $ 符号的冲突问题是常见问题之一.   在jQuery中,$是jQuery的别名,为了书写方便,我们更习惯用$('#id')这一类的方式来书写代码.当同一页面引用了jQuery多个版本 ...

  7. android EditText插入字符串到光标所在位置

    EditText mTextInput=(EditText)findViewById(R.id.input);//EditText对象 int index = mTextInput.getSelect ...

  8. easyui combobox赋值

    $('#cc').combobox('setValue','bitem3').combobox('setText','bitem3')

  9. 工欲善其事必先利其器---SQL在线可视化模型设计,(还可学习拖拽知识)

    作为技术人员,在开发项目中,不可避免的要跟数据库打交道,一个完整的项目正常情况下是讨论完整体需求,有了大致的框框在脑海中后,是需要设计合理的数据库的,这时会有其他的专业的UML建模工具可以使用, 但是 ...

  10. XML配置silverlight ,wcf 解析xml

    XML 代码: <?xml version="1.0" encoding="utf-8" ?><ChartSet  xmlns:xsi=&qu ...