度度熊保护村庄

Accepts: 13
Submissions: 488
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Problem Description

哗啦啦村袭击了喵哈哈村!

度度熊为了拯救喵哈哈村,带着自己的伙伴去救援喵哈哈村去了!度度熊与伙伴们很快的就过来占据了喵哈哈村的各个军事要地,牢牢的守住了喵哈哈村。

但是度度熊发现,这是一场旷日持久的战斗,所以度度熊决定要以逸待劳,保存尽量多的体力,去迎战哗啦啦村的战士。

于是度度熊决定派尽量多的人去休息,但是同时也不能松懈对喵哈哈村的保护。

换句话而言,度度熊希望尽量多的人休息,而且存在一个包围圈由剩下的人组成,且能够恰好的包围住喵哈哈村的所有住房(包括边界)。

请问最多能让多少个人休息呢?

Input

本题包含若干组测试数据。

第一行一个整数n,表示喵哈哈村的住房数量。

接下来n行,每行两个整数(x1[i],y1[i]),表示喵哈哈村的住房坐标。

第n+1行一个整数m,表示度度熊的士兵数量。

接下来m行,每行两个整数(x2[i],y2[i]),表示度度熊伙伴的坐标。

满足:

1<=n,m<=500

-10000<=x1[i],x2[i],y1[i],y2[i]<=10000

Output

请输出最多的人员休息的数目。

如果无法保护整个村庄的话,输出"ToT"

Sample Input
  1. 2
  2. 1 1
  3. 2 2
  4. 4
  5. 0 0
  6. 0 4
  7. 4 2
  8. 4 0
  9. 1
  10. 1 1
  11. 2
  12. 0 0
  13. 0 1
Sample Output
  1. 1
  2. ToT

题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=774&pid=1001

分析:参考 BZOJ1027,floyd求最小环,有两个情况要特判,一个是重点,一个室房屋恰好在两点的连线上

O(n*n)暴力枚举所有的点对,对于每个点O(n)检测,如果所有的房子都在一条连线的一侧,则这两个点连线,否则不连,如果这个图中都不存在环,那么输出ToT
下面给出AC代码:
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. using namespace std;
  5. #define inf 1044266558
  6. typedef struct Point
  7. {
  8. int x, y;
  9. Point operator - ( const Point &b ) const
  10. {
  11. Point c;
  12. c.x = x-b.x; c.y = y-b.y;
  13. return c;
  14. }
  15. double operator * ( const Point &b ) const
  16. {
  17. return x*b.y-y*b.x;
  18. }
  19. }Point;
  20. Point h[], s[];
  21. int n, m, ans, road[][];
  22. bool Jud(Point x, Point y, Point z)
  23. {
  24. if((x.x<z.x && y.x<z.x) || (x.y<z.y && y.y<z.y) || (x.x>z.x && y.x>z.x) || (x.y>z.y && y.y>z.y))
  25. return ;
  26. return ;
  27. }
  28. int main(void)
  29. {
  30. int i, j, k, flag;
  31. while(scanf("%d", &n)!=EOF)
  32. {
  33. memset(road, , sizeof(road));
  34. for(i=;i<=n;i++)
  35. scanf("%d%d", &h[i].x, &h[i].y);
  36. scanf("%d", &m);
  37. for(i=;i<=m;i++)
  38. scanf("%d%d", &s[i].x, &s[i].y);
  39. for(i=;i<=m;i++)
  40. {
  41. for(j=;j<=m;j++)
  42. {
  43. flag = ;
  44. for(k=;k<=n;k++)
  45. {
  46. if((s[i]-s[j])*(s[i]-h[k])< || (s[i]-s[j])*(s[i]-h[k])== && Jud(s[i], s[j], h[k]))
  47. {
  48. flag = ;
  49. break;
  50. }
  51. }
  52. if(flag)
  53. road[i][j] = ;
  54. }
  55. }
  56. ans = inf;
  57. for(k=;k<=m;k++)
  58. {
  59. for(i=;i<=m;i++)
  60. {
  61. if(road[i][k]==inf)
  62. continue;
  63. for(j=;j<=m;j++)
  64. road[i][j] = min(road[i][j], road[i][k]+road[k][j]);
  65. }
  66. }
  67. for(i=;i<=m;i++)
  68. ans = min(ans, road[i][i]);
  69. if(ans>m)
  70. printf("ToT\n");
  71. else
  72. printf("%d\n", m-ans);
  73. }
  74. return ;
  75. }

度度熊的王国战略

Accepts: 173
Submissions: 3298
Time Limit: 40000/20000 MS (Java/Others)
Memory Limit: 32768/132768 K (Java/Others)
Problem Description

度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族。

哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士。

所以这一场战争,将会十分艰难。

为了更好的进攻哗啦啦族,度度熊决定首先应该从内部瓦解哗啦啦族。

第一步就是应该使得哗啦啦族内部不能同心齐力,需要内部有间隙。

哗啦啦族一共有n个将领,他们一共有m个强关系,摧毁每一个强关系都需要一定的代价。

现在度度熊命令你需要摧毁一些强关系,使得内部的将领,不能通过这些强关系,连成一个完整的连通块,以保证战争的顺利进行。

请问最少应该付出多少的代价。

Input

本题包含若干组测试数据。

第一行两个整数n,m,表示有n个将领,m个关系。

接下来m行,每行三个整数u,v,w。表示u将领和v将领之间存在一个强关系,摧毁这个强关系需要代价w

数据范围:

2<=n<=3000

1<=m<=100000

1<=u,v<=n

1<=w<=1000

Output

对于每组测试数据,输出最小需要的代价。

Sample Input
  1. 2 1
  2. 1 2 1
  3. 3 3
  4. 1 2 5
  5. 1 2 4
  6. 2 3 3
Sample Output
  1. 1
  2. 3

题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=774&pid=1002

分析:歪解(并查集可过;正解似乎是堆优化+SW(最小正割),啥玩意,不懂!

下面给出AC代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define max(a,b) (a)>(b)?(a):(b);
  5. #define min(a,b) (a)>(b)?(b):(a);
  6. inline ll read()//读入优化
  7. {
  8. ll x=,f=;//f表示符号,x表示首位数字0
  9. char ch=getchar();
  10. while(ch<''||ch>'')//如果ch不是数字
  11. {
  12. if(ch=='-')//如果是符号就改变符号
  13. f=-;
  14. ch=getchar();
  15. }
  16. while(ch>=''&&ch<='')//如果ch是数字,接下来的每位数字
  17. {
  18. x=x*+ch-'';//将数字添加进x内
  19. ch=getchar();
  20. }
  21. return x*f;//返回数值
  22. }
  23. inline void write(ll x)//输出优化
  24. {
  25. if(x<)//判断小于0的情况
  26. {
  27. putchar('-');
  28. x=-x;
  29. }
  30. if(x>)//保存每一位
  31. {
  32. write(x/);
  33. }
  34. putchar(x%+'');//输出
  35. }
  36. inline ll gcd(ll a,ll b)
  37. {
  38. return b==?a:gcd(b,a%b);
  39. }
  40. const ll INF=1ll<<;
  41. const ll inf=-1ll<<;
  42. const ll N=;
  43. ll pre[N];
  44. bool t[N];//t 用于标记独立块的根结点
  45. inline ll find(ll x)//查找根节点
  46. {
  47. ll r=x;
  48. while(pre[r]!=r)
  49. r=pre[r];//返回根节点 r
  50. int i=x,j;
  51. while(pre[i]!=r)//路径压缩
  52. {
  53. j=pre[i]; // 在改变上级之前用临时变量 j 记录下他的值
  54. pre[i]=r;//把上级改为根节点
  55. i=j;
  56. }
  57. return r;
  58. }
  59. inline void join(ll x,ll y)//判断x y是否连通,
  60. {
  61. ll fx=find(x),fy=find(y);
  62. if(fx!=fy)
  63. pre[fy]=fx;//如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起来
  64. }
  65. ll n,m;
  66. ll num[N];
  67. int main()
  68. {
  69. while(scanf("%lld%lld",&n,&m)!=EOF)
  70. {
  71. /*
  72. for(i=1;i<=N;i++)
  73. pre[i]=i;//初始化
  74. for(i=1;i<=M;i++)
  75. {
  76. scanf("%d%d",&a,&b);
  77. join(a,b);//判断x y是否连通
  78. }
  79. memset(t,0,sizeof(t));
  80. for(i=1;i<=N;i++)
  81. t[find(i)]=1;//标记根结点
  82. for(ans=0,i=1;i<=N;i++)
  83. if(t[i])
  84. ans++;
  85. printf("%d\n",ans-1);
  86. */
  87. for(ll i=;i<=n;++i)
  88. {
  89. pre[i]=i;
  90. }
  91. memset(num,false,sizeof(num));
  92. ll cnt=;
  93. for(ll i=;i<m;++i)
  94. {
  95. ll x,y,z;
  96. x=read();
  97. y=read();
  98. z=read();
  99. if(x==y)
  100. continue;
  101. num[y]+=z;
  102. num[x]+=z;
  103. if(find(x)!=find(y))
  104. {
  105. pre[find(x)]=find(y);
  106. ++cnt;
  107. }
  108. }
  109. if(cnt!=n-)
  110. {
  111. printf("0\n");
  112. continue;
  113. }
  114. ll ans=num[];
  115. for(ll i=;i<=n;i++)
  116. ans=min(ans,num[i]);
  117. write(ans);
  118. printf("\n");
  119. }
  120. return ;
  121. }

度度熊与邪恶大魔王

Accepts: 2114
Submissions: 13031
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Problem Description

度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来。

邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力。

度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k[i]的晶石,造成p[i]点伤害。

当然,如果度度熊使用第i个技能打在第j个怪兽上面的话,会使得第j个怪兽的生命值减少p[i]-b[j],当然如果伤害小于防御,那么攻击就不会奏效。

如果怪兽的生命值降为0或以下,那么怪兽就会被消灭。

当然每个技能都可以使用无限次。

请问度度熊最少携带多少晶石,就可以消灭所有的怪兽。

Input

本题包含若干组测试数据。

第一行两个整数n,m,表示有n个怪兽,m种技能。

接下来n行,每行两个整数,a[i],b[i],分别表示怪兽的生命值和防御力。

再接下来m行,每行两个整数k[i]和p[i],分别表示技能的消耗晶石数目和技能的伤害值。

数据范围:

1<=n<=100000

1<=m<=1000

1<=a[i]<=1000

0<=b[i]<=10

0<=k[i]<=100000

0<=p[i]<=1000

Output

对于每组测试数据,输出最小的晶石消耗数量,如果不能击败所有的怪兽,输出-1

Sample Input
  1. 1 2
  2. 3 5
  3. 7 10
  4. 6 8
  5. 1 2
  6. 3 5
  7. 10 7
  8. 8 6
Sample Output
  1. 6
  2. 18

题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=774&pid=1003

分析:完全背包嘛,签到题的说,对着完全背包看看就好咯,不会的请移步这里

  1. #include <bits/stdc++.h>
  2. #include <stdio.h>
  3. using namespace std;
  4. typedef __int64 ll;
  5. #define max(a,b) (a)>(b)?(a):(b);
  6. #define min(a,b) (a)>(b)?(b):(a);
  7. inline ll read()//读入优化
  8. {
  9. ll x=,f=;//f表示符号,x表示首位数字0
  10. char ch=getchar();
  11. while(ch<''||ch>'')//如果ch不是数字
  12. {
  13. if(ch=='-')//如果是符号就改变符号
  14. f=-;
  15. ch=getchar();
  16. }
  17. while(ch>=''&&ch<='')//如果ch是数字,接下来的每位数字
  18. {
  19. x=x*+ch-'';//将数字添加进x内
  20. ch=getchar();
  21. }
  22. return x*f;//返回数值
  23. }
  24. inline void write(ll x)//输出优化
  25. {
  26. if(x<)//判断小于0的情况
  27. {
  28. putchar('-');
  29. x=-x;
  30. }
  31. if(x>)//保存每一位
  32. {
  33. write(x/);
  34. }
  35. putchar(x%+'');//输出
  36. }
  37. inline ll gcd(ll a,ll b)
  38. {
  39. return b==?a:gcd(b,a%b);
  40. }
  41. const int N=;
  42. const ll INF=1ll<<;
  43. const ll inf=-1ll<<;
  44. ll w[N],v[N];
  45. ll x[N],y[N];
  46. ll dp[][N];
  47. ll n,m;
  48. int main()
  49. {
  50. while(scanf("%I64d%I64d",&n,&m)!=EOF)
  51. {
  52. for(ll i=;i<=n;i++)
  53. w[i]=read(),v[i]=read();
  54. for(ll i=;i<=m;i++)
  55. x[i]=read(),y[i]=read();
  56. for(ll i=;i<=;i++)
  57. {
  58. dp[i][]=;
  59. for(ll j=;j<=;j++)
  60. dp[i][j]=INF;
  61. for(ll j=;j<=m;j++)
  62. {
  63. if(y[j]<=i)
  64. continue;
  65. for(ll k=;k<=;k++)
  66. {
  67. ll q=max(k-y[j]+i,);
  68. dp[i][k]=min(dp[i][k],dp[i][q]+x[j]);
  69. }
  70. }
  71. }
  72. ll ans=;
  73. for(ll i=;i<=n;i++)
  74. {
  75. if(dp[v[i]][w[i]]==INF)
  76. {
  77. ans=-;
  78. break;
  79. }
  80. ans+=dp[v[i]][w[i]];
  81. }
  82. write(ans);
  83. printf("\n");
  84. //cout<<ans<<endl;
  85. //printf("%I64d\n",ans);
  86. }
  87. return ;
  88. }

度度熊的午饭时光

Accepts: 375
Submissions: 5441
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Problem Description

度度熊最期待每天的午饭时光,因为早饭菜品清淡,晚饭减肥不敢吃太多(胖纸的忧伤T.T)。

百度食堂的午餐超级丰富,祖国各大菜系应有尽有,度度熊在每个窗口都有爱吃的菜品,而且他还为喜爱的菜品打了分,吃货的情怀呀(>.<)。

但是,好吃的饭菜总是很贵,每天的午饭预算有限,请帮度度熊算一算,怎样打饭才能买到的最好吃的饭菜?(不超过预算、不重样、午餐等分最高的情况下,选择菜品序号加和最小,加和相等时字典序最小的组合)

Input

第一行一个整数T,表示T组数据。 每组测试数据将以如下格式从标准输入读入:

B

N

score_1 cost_1

score_2 cost_2

:

score_N cost_N

第一行,正整数B(0 <= B <= 1000),代表午餐的预算。

第二行,正整数N (0 <= N <= 100),代表午餐可选的菜品数量

从第三行到第 (N + 2) 行,每行两个正整数,以空格分隔,score_i表示菜品的得分,cost_i表示菜品的价格(0 <= score_i, cost_i <= 100)。

Output

对于每组数据,输出两行: 第一行输出:"Case #i:"。i代表第i组测试数据。 第二行输出菜品的总得分和总花费,以空格分隔。 第三行输出所选菜品的序号,菜品序号从1开始,以空格分隔。

Sample Input
  1. 2
  2. 29
  3. 6
  4. 9 10
  5. 3 4
  6. 6 5
  7. 7 20
  8. 10 9
  9. 15 11
  10. 0
  11. 2
  12. 2 23
  13. 10 12
Sample Output
  1. Case #1:
  2. 34 29
  3. 2 3 5 6
  4. Case #2:
  5. 0 0

题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=774&pid=1004

分析:01背包裸题,要在最大化总得分的情况下最小化序号之和,并输出字典序最小的解,在不打饭的情况下不输出空行,嗯,就是介个样子!

下面给出AC代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. typedef long long ll;
  6. #define max(a,b) (a)>(b)?(a):(b);
  7. #define min(a,b) (a)>(b)?(b):(a);
  8. inline ll read()//读入优化
  9. {
  10. ll x=,f=;//f表示符号,x表示首位数字0
  11. char ch=getchar();
  12. while(ch<''||ch>'')//如果ch不是数字
  13. {
  14. if(ch=='-')//如果是符号就改变符号
  15. f=-;
  16. ch=getchar();
  17. }
  18. while(ch>=''&&ch<='')//如果ch是数字,接下来的每位数字
  19. {
  20. x=x*+ch-'';//将数字添加进x内
  21. ch=getchar();
  22. }
  23. return x*f;//返回数值
  24. }
  25. inline void write(ll x)//输出优化
  26. {
  27. if(x<)//判断小于0的情况
  28. {
  29. putchar('-');
  30. x=-x;
  31. }
  32. if(x>)//保存每一位
  33. {
  34. write(x/);
  35. }
  36. putchar(x%+'');//输出
  37. }
  38. inline ll gcd(ll a,ll b)
  39. {
  40. return b==?a:gcd(b,a%b);
  41. }
  42. const ll INF=1ll<<;
  43. const ll inf=-1ll<<;
  44. const ll N=;
  45. ll w[N],v[N];
  46. ll u[N];
  47. ll dp[N][N];
  48. bool vis[N][N];
  49. //-------------------------------------------
  50. inline ll solve(ll x,ll y)
  51. {
  52. ll pp=dp[x][];
  53. ll qq=dp[y][];
  54. for(ll p=,q=;p<=pp&&q<=qq;++p,++q)
  55. {
  56. if(dp[pp][p]!=dp[qq][q])
  57. return dp[pp][p]-dp[qq][q];
  58. }
  59. return ;
  60. }
  61. //-------------------------------------------
  62. ll T,n,m;
  63. int main()
  64. {
  65. while(scanf("%lld",&T)!=EOF)
  66. {
  67. //T=read();
  68. for(ll i=;i<=T;++i)
  69. {
  70. m=read();
  71. n=read();
  72. memset(u,false,sizeof(u));
  73. memset(vis,false,sizeof(vis));
  74. memset(dp,false,sizeof(dp));
  75. memset(v,false,sizeof(v));
  76. memset(w,false,sizeof(w));
  77. for(ll j=;j<=n;++j)
  78. {
  79. v[j]=read();
  80. w[j]=read();
  81. }
  82. printf("Case #%lld:\n",i);
  83. for(ll j=;j<=n;++j)
  84. {
  85. for(ll k=m;k>=w[j];--k)
  86. {
  87. //ll a=u[k];
  88. //u[k]=max(u[k],u[k-w[j]]+v[j]);
  89. //if(a!=u[k])
  90. //vis[j][k]=1;
  91. if(u[k]<u[k-w[j]]+v[j])
  92. {
  93. u[k]=u[k-w[j]]+v[j];
  94. vis[j][k]=true;
  95. }
  96. }
  97. }
  98. //
  99. ll maxn=;
  100. for(ll j=;j<=m;++j)
  101. maxn=max(maxn,u[j]);
  102. //
  103. ll sum=INF;
  104. ll x=,num=;
  105. for(ll j=m;j>=;--j)
  106. {
  107. if(u[j]==maxn)
  108. {
  109. ll sumsum=;
  110. ll pre=;
  111. ll xx=n,yy=j;
  112. while(xx>=&&yy>=)
  113. {
  114. if(vis[xx][yy])
  115. {
  116. dp[x][pre++]=xx;
  117. //pre++;
  118. sumsum+=xx;
  119. yy-=w[xx];
  120. }
  121. xx--;
  122. }
  123. dp[x][]=pre-;
  124. sort(dp[x]+,dp[x]++dp[x][]);
  125. if(sum>sumsum)
  126. {
  127. sum=sumsum;
  128. num=x;
  129. }
  130. else if(sum==sumsum&&solve(x,num)<)
  131. {
  132. sum=sumsum;
  133. num=x;
  134. }
  135. x++;
  136. }
  137. }
  138. ///
  139. ll val=,cost=;
  140. ll top=dp[num][];
  141. sort(dp[num]+,dp[num]++dp[num][]);
  142. for(ll a=;a<=top;++a)
  143. {
  144. val+=v[dp[num][a]];
  145. cost+=w[dp[num][a]];
  146. }
  147. //printf("Case #%lld:\n",i);
  148. printf("%lld %lld\n",val,cost);
  149. for(ll a=;a<top;++a)
  150. printf("%lld ",dp[num][a]);
  151. if(top>=)
  152. printf("%lld\n",dp[num][top]);
  153. }
  154. }
  155. return ;
  156. }

寻找母串

Accepts: 82
Submissions: 676
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Problem Description

对于一个串S,当它同时满足如下条件时,它就是一个01偏串: 1、只由0和1两种符组成; 2、在S的每一个前缀中,0的个数不超过1的个数; 3、S中0的个数和1的个数相等。

现在给定01偏串S,请计算一下S在所有长度为n的01偏串中作为子串出现的次数的总和。 由于结果比较大,结果对1e9+7取余后输出。

样例解释: 在第二个样例中,长度为4的偏串共两个1010,1100。10在1010中出现了两次,在1100中出现了1次。所以答案是3。

Input

第一行给出一个整数T(1<=T<=40),表示测试数据的数目。 每一组测试包含一个整数n和字符串S,中间用空格分开。(1<=|S|<=100000,1<=n<=1000000000)

输入保证S是一个01偏串。

Output

对于每一组数据,输出一个整数占一行,表示答案。

Sample Input
  1. 2
  2. 2 10
  3. 4 10
Sample Output
  1. 1
  2. 3

题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=774&pid=1005

分析:

  1.  

这题看起来束手无策,但其实你可以先写个暴力观察小数据,这个时候你就会发现其实这题比你想象的要简单的多

  1.  

(比如你会发现其实答案之和字符串的长度|S|有关,和字符串的内容是无关的)

  1.  

没错!这题有规律,答案就是

  1.  

  1.  

但是别高兴的太早,这个时候你又会发现其实这题比你想象的要难得多

  1.  

因为这题的n范围巨大(约10亿)而求10亿的组合数是做不到的

  1.  

所有先考虑化简公式看看,令x = (n-|S|)/2+1有

  1.  

  1.  

其中F[x]是第x项卡特兰数

通项公式:F[n] = C(2n, n)/(n+1) = C(2n, n)-C(2n, n-1)

递推公式:F[n+1] = 2*(2*n+1)/(n+2)*F[n]

F[n] = F[0]*F[n-1]+F[1]*F[n-2]+…+F[n-1]*F[0]

  1.  

而卡特兰数有O(n)的递推公式

  1.  

  1.  

这样的话理论上可以O(n)求出所有的答案,可还是不行。。。

  1.  

复杂度已经不能再优化了。。所以只能考虑打表

  1.  

可是你又开不了10亿的数组,但是这题也没有说要O(1)询问呀

  1.  

没错!分块打表

  1.  

你只需要后台O(n)暴力出第100000个卡特兰数,第200000个卡特兰数……第500000000个卡特兰数就好了

  1.  

也就是开个5000+的数组s[],其中s[i]是第100000*i个卡特兰数

  1.  

然后对于每组询问(n, |S|),先计算x=(n-|S|)/2+1,然后再找到x所在的那一块(比x小离x最近的100000的倍数),

  1.  

之后暴力转移就好,最多转移100000次

  1.  

因为有除法所以要乘法逆元,总体复杂度O(100000log(n))

  1.  

还有注意n为奇数的时候答案一定为0,因为母串要保证0和1的数量相等,所以不存在长度为奇数的母串

  1.  

除此之外,n<|S|答案也为0

  1. 接下来只以10101010101010为例
    模式串: 字串: 匹配条件:
    10 10 10 1 total 1
    1010 10 1010 2
    1100 1 total 3
    101010 10 101010 3
    101100 2
    110100 2
    110010 2
    111000 1 total 10
    10101010 10 10101010 4
    10101100
    3
    10110100 3
    11010100 3
    10110010 3
    11001010 3
    11010010 3
    11011000 2
    11001100 2
    10111000 2
    11101000 2
    11100100 2
    11100010 2
    11110000 1 total 35
  2. 即组合数Cn*2-1nn=(n-strlens))/2+1
    =f[n]*(n+1)/2;
    f[n]=2*(2*n-1)*f[n-1]/(i+1);
    下面给出AC打表代码:(打了一天的表)
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll N=;
  5. #define max(a,b) (a)>(b)?(a):(b);
  6. #define min(a,b) (a)>(b)?(b):(a);
  7. inline ll read()//读入优化
  8. {
  9. ll x=,f=;//f表示符号,x表示首位数字0
  10. char ch=getchar();
  11. while(ch<''||ch>'')//如果ch不是数字
  12. {
  13. if(ch=='-')//如果是符号就改变符号
  14. f=-;
  15. ch=getchar();
  16. }
  17. while(ch>=''&&ch<='')//如果ch是数字,接下来的每位数字
  18. {
  19. x=x*+ch-'';//将数字添加进x内
  20. ch=getchar();
  21. }
  22. return x*f;//返回数值
  23. }
  24. inline void write(ll x)//输出优化
  25. {
  26. if(x<)//判断小于0的情况
  27. {
  28. putchar('-');
  29. x=-x;
  30. }
  31. if(x>)//保存每一位
  32. {
  33. write(x/);
  34. }
  35. putchar(x%+'');//输出
  36. }
  37. ll pre[N];
  38. bool t[N];//t 用于标记独立块的根结点
  39. inline ll find(ll x)//查找根节点
  40. {
  41. ll r=x;
  42. while(pre[r]!=r)
  43. r=pre[r];//返回根节点 r
  44. int i=x,j;
  45. while(pre[i]!=r)//路径压缩
  46. {
  47. j=pre[i]; // 在改变上级之前用临时变量 j 记录下他的值
  48. pre[i]=r;//把上级改为根节点
  49. i=j;
  50. }
  51. return r;
  52. }
  53. inline void join(ll x,ll y)//判断x y是否连通,
  54. {
  55. ll fx=find(x),fy=find(y);
  56. if(fx!=fy)
  57. pre[fy]=fx;//如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起来
  58. }
  59. const ll mod=;
  60. inline ll gcd(ll a,ll b)
  61. {
  62. return b==?a:gcd(b,a%b);
  63. }
  64. inline ll qpow(ll x,ll p)
  65. {
  66. ll ret=;
  67. for(;p;p>>=,x=x*x%mod)
  68. {
  69. if(p&)
  70. ret=ret*x%mod;
  71. }
  72. return ret;
  73. }
  74. const ll INF=1ll<<;
  75. const ll inf=-1ll<<;
  76. char str[N];
  77. ll s[N]=
  78. {
  79. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  80. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  81. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  82. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  83. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  84. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  85. };
  86. ll T,n;
  87. int main()
  88. {
  89. ios::sync_with_stdio(false);
  90. T=read();
  91. while(T--)
  92. {
  93. scanf("%d%s",&n,&str);
  94. ll len=strlen(str);
  95. if(len>n||n&)
  96. {
  97. printf("0\n");
  98. continue;
  99. }
  100. ll pp=(n-len)/+;
  101. ll x=pp/;
  102. ll ans=s[x];
  103. for(ll i=x*+;i<=pp;++i)
  104. ans=(ans**(i*-)%mod*qpow(i+,mod-)%mod)%mod;
  105. ans=(ans*(pp+)%mod*qpow(,mod-)%mod)%mod;
  106. write(ans);
  107. printf("\n");
  108. }
  109. return ;
  110. }
  1.  
  1.  
  1.  

2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】的更多相关文章

  1. hdu 6082 度度熊与邪恶大魔王(2017"百度之星"程序设计大赛 - 资格赛 )

    度度熊与邪恶大魔王 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. 2017"百度之星"程序设计大赛 - 复赛1001&&HDU 6144 Arithmetic of Bomb【java大模拟】

    Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. [SinGuLaRiTy] 2017 百度之星程序设计大赛-资格赛

    [SinGuLaRiTy-1034] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 度度熊保护村庄  Time Limit: 2000/10 ...

  4. 2017"百度之星"程序设计大赛 - 资格赛

    度度熊与邪恶大魔王  Accepts: 3666  Submissions: 22474  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: ...

  5. 2017"百度之星"程序设计大赛 - 资格赛-度度熊与邪恶大魔王(dp+后缀最小值)

    度度熊与邪恶大魔王 思路:由于防御和血量的范围很小,所以暴力枚举出对于每种防御造成的每种伤害所需的最小花费,最后只需在伤害大于等于血量的情况下再找到最小花费(这个只需要后缀最小值预处理一下就可以了) ...

  6. 2014年百度之星程序设计大赛 - 资格赛 1001 Energy Conversion

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/sr19930829/article/details/26003661 Energy Conversi ...

  7. 2017"百度之星"程序设计大赛 - 资格赛 寻找母串

    Problem Description 对于一个串S,当它同时满足如下条件时,它就是一个01偏串: 1.只由0和1两种符组成: 2.在S的每一个前缀中,0的个数不超过1的个数: 3.S中0的个数和1的 ...

  8. 2017"百度之星"程序设计大赛 - 资格赛 度度熊的王国战略

    度度熊的王国战略 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. 为了更好的进攻哗啦啦族,度度 ...

  9. 2017"百度之星"程序设计大赛 - 资格赛 1002 度度熊的王国战略

    全局最小割 Stoer-Wagner (SW算法)优化 优化吃藕了,感谢放宽时限,感谢平板电视 (pb_ds) #include <iostream> #include <cstdi ...

随机推荐

  1. iOS 用户密码 数字字母特殊符号设置 判断

    //直接调用这个方法就行 -(int)checkIsHaveNumAndLetter:(NSString*)password{ //数字条件 NSRegularExpression *tNumRegu ...

  2. 每周.NET前沿技术文章摘要(2017-06-07)

    汇总国外.NET社区相关文章,覆盖.NET ,ASP.NET等内容: .NET .NET Core and .NET Framework Working Together, Or: The Magic ...

  3. 平方根的C语言实现(三) ——最终程序实现

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7223254.html 作者:窗户 Q ...

  4. splay小结—植树结

    我要把高级数据结构当爸爸了... ...弱到跪烂了. splay,二叉搜索树的一种,具有稳定变形功能. 二叉搜索树:对于一个节点,都只有不超过2个孩子.其左子树内的点的权值都比这个点小,右子树的点的权 ...

  5. 网络实时流量监控工具iftop---转

    网络实时流量监控工具iftop 分类: LINUX 1.安装依赖软件库 [root@localhost ~]# yum install libpcap libpcap-devel ncurses nc ...

  6. K:java中序列化的两种方式—Serializable或Externalizable

    在java中,对一个对象进行序列化操作,其有如下两种方式: 第一种: 通过实现java.io.Serializable接口,该接口是一个标志接口,其没有任何抽象方法需要进行重写,实现了Serializ ...

  7. JavaScript学习点滴 call、apply的区别

    对于apply和call两者在作用上是相同的,但两者在参数上有区别的.     1.call call 方法 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1 ...

  8. sql优化原则与技巧

    加快sql查询是非常重要的技巧,简单来说加快sql查询的方式有以下几种:一.索引的引用 1.索引一般可以加速数据的检索速度,加速表与表之间的链接,提高性能,所以在对海量数据进行处理时,考虑到信息量比较 ...

  9. 通过tokenPlease()函数获取accessToken

    作者:陈希章 发表于 2018年1月5日 这是一个很小的技巧,而且用几句话就能讲明白.事情是这样的,我最近在回顾之前写过的文章:通过其他第三方工具体验Microsoft Graph 的时候,发现最近的 ...

  10. vue2.0 配置build项目打包目录、资源文件(assets\static)打包目录

    vue项目默认的打包路径:根目录下的dist文件夹下: 但是在项目开发中,我们肯定希望项目提交到svn目录或者git目录下,否则每次复制过去,太麻烦了: 那怎么配置打包路径呢?下面来看看: 我们找到打 ...