2013成都网赛 G(x) (HDU 4733)
思路:
首先搞清楚每个位置上的值有什么意义, 如果第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.
- #include <cstdio>
- #include <cstring>
- #include <vector>
- #include <queue>
- #include <iostream>
- #include <string>
- #include <ctime>
- #include <algorithm>
- #include <cmath>
- #include <ctime>
- using namespace std;
- #define maxn 100010
- typedef long long llong;
- const llong mod = ;
- char g1[maxn],g2[maxn];
- int ww[maxn],w1[maxn],ueql[maxn],all1[maxn];
- llong f[][maxn];
- void pretreat()
- {
- int i,len;
- len = strlen(g1);
- memset(ww,,sizeof(ww));
- memset(w1,,sizeof(w1));
- memset(ueql,,sizeof(ueql));
- memset(all1,,sizeof(all1));
- for ( i= ; i<len ; i++ )
- {
- if (g1[i]=='?'&&g2[i]=='?') ww[i]=;
- else if (g1[i]==''&&g2[i]=='') all1[i]=;
- else if ((g1[i]=='?'&&g2[i]=='') || (g1[i]==''&&g2[i]=='?')) w1[i]=;
- else if ((g1[i]==''&&g2[i]=='') || (g1[i]==''&&g2[i]=='')) ueql[i]=;
- }
- for ( i= ; i<len ; i++ )
- {
- ww[i] += ww[i-];
- w1[i] += w1[i-];
- all1[i] += all1[i-];
- ueql[i] += ueql[i-];
- }
- }
- bool can(int pos,int len)
- {
- int cnt1;
- if (g1[pos]==''&&g2[pos]=='') return false;
- if (g1[pos]==''&&g2[pos]=='') return false;
- if (pos+<len&&(g1[pos+]=='' || g2[pos+]=='')) return false;
- if (pos->=&&ueql[pos-]) return false;
- if (pos+<len) cnt1 = w1[len-]-w1[pos+]+all1[len-]-all1[pos+]+ueql[len-]-ueql[pos+];
- else cnt1 = ;
- if (cnt1) return false;
- if (pos==len-) return true;
- return true;
- }
- void PrintAns(int pos,int k)
- {
- int i,len,cnt1;
- g1[pos]=k+'';
- g2[pos]=-k+'';
- len = strlen(g1);
- if (pos) cnt1 = w1[pos-]+all1[pos-];
- else cnt1 = ;
- for ( i=len- ; i>pos+ ; i-- ) g1[i]=g2[i]='';
- if (pos+<=len-) g1[pos+]=g2[pos+]='';
- for ( i= ; i<pos ; i++ )
- {
- if (g1[i]=='?'&&g2[i]=='') g1[i]='';
- if (g1[i]==''&&g2[i]=='?') g2[i]='';
- if (g1[i]==''&&g2[i]=='?') g2[i]='';
- if (g1[i]=='?'&&g2[i]=='') g1[i]='';
- if (g1[i]=='?'&&g2[i]=='?')
- {
- if (k==)
- {
- if (cnt1%) g1[i]=g2[i]='';
- else g1[i]=g2[i]='';
- }else
- {
- if (cnt1%) g1[i]=g2[i]='';
- else g1[i]=g2[i]='';
- }
- }
- }
- g1[len]=g2[len]=;
- // printf("%s\n%s\n",g1,g2);
- cout<<g1<<endl<<g2<<endl;;
- }
- int getvar(int i,int j)
- {
- if (i== && j>=) return ;
- if (i== && j>=) return ;
- return f[i][j];
- }
- void solv()
- {
- int i,flg,pos,len,k,cnt1,cntw;
- llong ans=;
- len = strlen(g1);
- flg = ;
- // printf("len=%d\n",len);
- // printf("%s\n%s\n",g1,g2);
- for ( i= ; i<len ; i++ )
- if (can(i,len))
- {
- // printf("w1[len-1]-w1[pos+1]=%d-%d=%d\n",w1[len-1],w1[i+1],w1[len-1]-w1[i+1]);
- if (i) cnt1 = w1[i-] + all1[i-];
- else cnt1=;
- if (i) cntw = ww[i-];
- else cntw=;
- // printf("%c %c\n",g1[i],g2[i]);
- // printf("i=%d cnt1=%d cntw=%d uneql=%d\n",i,cnt1,cntw,i>0?ueql[i-1]:0);
- if (g1[i]!=''&&g2[i]!=''&&i) // k=1
- {
- if (cnt1%)
- {
- ans += f[][cntw];
- int tmp = getvar(,cntw);
- flg += tmp;
- if (tmp&&flg==) pos=i,k=;
- }else
- {
- ans += f[][cntw];
- int tmp = getvar(,cntw);
- flg += tmp;
- if (tmp&&flg==) pos=i,k=;
- }
- }
- if (g1[i]!=''&&g2[i]!='') // k=0
- {
- if (cnt1%)
- {
- ans += f[][cntw];
- int tmp = getvar(,cntw);
- flg += tmp;
- if (tmp&&flg==) pos=i,k=;
- }else
- {
- ans += f[][cntw];
- int tmp = getvar(,cntw);
- flg += tmp;
- if (tmp&&flg==) pos=i,k=;
- }
- }
- while (ans >= mod) ans -= mod;
- }
- if (flg>) cout<<"Ambiguous "<<ans<<endl;
- else if (flg==) cout<<"Impossible"<<endl;
- else PrintAns(pos,k);
- }
- void initDp()
- {
- int i,j;
- f[][] = ;
- f[][] = ;
- for ( i= ; i<maxn ; i++ )
- for ( j= ; j< ; j++ )
- {
- f[j][i] = f[-j][i-]+f[j][i-];
- while (f[j][i]>=mod) f[j][i] -= mod;
- }
- // for ( i=0 ; i<20 ; i++ ) printf("f[0][%d]=%I64d f[1][%d]=%I64d\n",i,f[0][i],i,f[1][i]);
- }
- int main()
- {
- int cas,tt=;
- freopen("test.txt","r",stdin);
- // freopen("my.txt","w",stdout);
- scanf("%d",&cas);
- initDp();
- for ( tt= ; tt<=cas ; tt++ )
- {
- printf("Case #%d:\n",tt);
- scanf("%s",g1);
- scanf("%s",g2);
- pretreat();
- solv();
- }
- return ;
- }
几组数据:
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)的更多相关文章
- 2013成都网赛1003 hdu 4730 We Love MOE Girls
题意:有一个字符串,若以"desu"结尾,则将末尾的"desu"替换为"nanodesu",否则在字符串末尾加上"nanodesu ...
- 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 ...
- HDU 4733 G(x) (2013成都网络赛,递推)
G(x) Time Limit: 2000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 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) ...
- 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 ...
- HDU 4734 F(x) (2013成都网络赛,数位DP)
F(x) Time Limit: 1000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 4731 Minimum palindrome (2013成都网络赛,找规律构造)
Minimum palindrome Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...
- 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, ...
随机推荐
- 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 ...
- DHTML【8】--CSS
在讲HTML时说过,有个Style标签是在CSS里用的,是的,在HTML中添加CSS样式必须要用到Style,在标签里单独定义标签属性时用的是Style属性.上一节我们也说过,先不用管那个Style标 ...
- Android——自定义Actionbar左侧覆盖不全的解决方案
今天遇到一个很蛋疼的问题,就是在自定义Actionbar的时候,setCustomView中,自定义的view怎么也覆盖不了整个视图,左侧一直留有一个空白,看下图: 所写的部分代码如下: protec ...
- (转)iOS7界面设计规范(11) - UI基础 - 图标与图形
不知别人如何,我自己来讲,平时很习惯很有动力去做的一些事,譬如博客吧,一旦生活中出现一些让自己很难受的状况,就很容易受到影响:像是,你平时所习惯的生活状态都是基于某种东西的,一旦这种东西崩塌,会影响到 ...
- HTML5新增的一些属性和功能之六——拖拽事件
拖放事件的前提是分为源对象和目标对象,你鼠标拖着的是源对象,你要放置的位置是目标对象,区分这两个对象是因为HTML5的拖放事件对两者是不同的. 被拖动的源对象可以触发的事件: 1).ondragsta ...
- jQuery中 $ 符号的冲突问题
jQuery中 $ 符号的冲突问题是常见问题之一. 在jQuery中,$是jQuery的别名,为了书写方便,我们更习惯用$('#id')这一类的方式来书写代码.当同一页面引用了jQuery多个版本 ...
- android EditText插入字符串到光标所在位置
EditText mTextInput=(EditText)findViewById(R.id.input);//EditText对象 int index = mTextInput.getSelect ...
- easyui combobox赋值
$('#cc').combobox('setValue','bitem3').combobox('setText','bitem3')
- 工欲善其事必先利其器---SQL在线可视化模型设计,(还可学习拖拽知识)
作为技术人员,在开发项目中,不可避免的要跟数据库打交道,一个完整的项目正常情况下是讨论完整体需求,有了大致的框框在脑海中后,是需要设计合理的数据库的,这时会有其他的专业的UML建模工具可以使用, 但是 ...
- XML配置silverlight ,wcf 解析xml
XML 代码: <?xml version="1.0" encoding="utf-8" ?><ChartSet xmlns:xsi=&qu ...