暴力枚举每一位是否进位,然后就可以高斯消元解出方程了。然而复杂度是O(2nn3),相当不靠谱。

  考虑优化。注意到某一位进位情况的变化只会影响到方程的常数项,于是可以在最开始做一次高斯消元算出每个未知数与每个常数项的关系。这样就变成了O(2nn2),虽然仍然不靠谱不过经常可以早早break,就能过了。

  似乎有一些挺麻烦的地方怎么都调不对,后来就变成了面向代码编程也不知道改了什么最后几乎全一样了才过。事实上还是有bug的,比如2 AB BA AA这样的数据会re掉,原因是方程看似解不出来但是有所有数不同的限制,应该还要特判一下然而懒得写了。
  当然这本来是个剪枝题。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. using namespace std;
  8. int read()
  9. {
  10. int x=,f=;char c=getchar();
  11. while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
  12. while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
  13. return x*f;
  14. }
  15. #define N 30
  16. int n,m,a[N],b[N],c[N],f[N][N],d[N][N],u[N];
  17. bool flag[N];
  18. int gcd(int n,int m){return m==?n:gcd(m,n%m);}
  19. void gauss()
  20. {
  21. for (int i=;i<=n;i++) d[i][i-]=-,d[i][i]=n;
  22. for (int i=;i<=n;i++)
  23. f[i][c[i]]--,f[i][a[i]]++,f[i][b[i]]++;
  24. for (int i=,t=;i<=n&&t<=n;i++,t++)
  25. {
  26. int mx=i;
  27. for (int j=i+;j<=n;j++)
  28. if (abs(f[j][t])>abs(f[mx][t])) mx=j;
  29. if (mx!=i) swap(f[i],f[mx]),swap(d[i],d[mx]);
  30. if (!f[i][t]) {i--;continue;}
  31. for (int j=;j<=n;j++)
  32. if (i!=j&&f[j][t])
  33. {
  34. int x=f[j][t]/gcd(f[j][t],f[i][t]),y=f[i][t]/gcd(f[j][t],f[i][t]);
  35. for (int k=;k<=n;k++)
  36. f[j][k]=f[j][k]*y-f[i][k]*x,
  37. d[j][k]=d[j][k]*y-d[i][k]*x;
  38. }
  39. }
  40. }
  41. void print()
  42. {
  43. int a[N]={};
  44. for (int i=;i<=n;i++)
  45. {
  46. for (int j=;j<=n;j++)
  47. a[i]+=d[i][j]*u[j];
  48. a[i]/=f[i][i];
  49. }
  50. for (int i=;i<=n;i++) cout<<a[i]<<' ';
  51. exit();
  52. }
  53. void check()
  54. {
  55. memset(flag,,sizeof(flag));
  56. for (int i=;i<=n;i++)
  57. {
  58. int x=;
  59. for (int j=;j<=n;j++) x+=d[i][j]*u[j];
  60. if (x%f[i][i]) return;
  61. x/=f[i][i];
  62. if (x<||x>=n||flag[x]) return;
  63. flag[x]=;
  64. }
  65. print();
  66. }
  67. void dfs(int k)
  68. {
  69. if (k==n) check();
  70. else u[k]++,dfs(k+),u[k]--,dfs(k+);
  71. }
  72. int main()
  73. {
  74. #ifndef ONLINE_JUDGE
  75. freopen("calc.in","r",stdin);
  76. freopen("calc.out","w",stdout);
  77. const char LL[]="%I64d\n";
  78. #else
  79. const char LL[]="%lld\n";
  80. #endif
  81. n=read();
  82. char ch=getchar();while (ch<'A'||ch>'Z') ch=getchar();
  83. for (int i=;i<=n;i++) m=max(m,a[i]=ch-'A'+),ch=getchar();
  84. while (ch<'A'||ch>'Z') ch=getchar();
  85. for (int i=;i<=n;i++) m=max(m,b[i]=ch-'A'+),ch=getchar();
  86. while (ch<'A'||ch>'Z') ch=getchar();
  87. for (int i=;i<=n;i++) m=max(m,c[i]=ch-'A'+),ch=getchar();
  88. reverse(a+,a+n+),reverse(b+,b+n+),reverse(c+,c+n+);
  89. gauss();
  90. dfs();
  91. return ;
  92. }

Luogu1092 NOIP2004虫食算(搜索+高斯消元)的更多相关文章

  1. [BZOJ1902]:[NOIP2004]虫食算(搜索)

    题目传送门 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母. 来看一个简单的例子: 43#98650#45+8468#6633=444455069 ...

  2. NOIP2004 虫食算

    描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表 ...

  3. [题解](折半搜索/高斯消元枚举自由元)BZOJ_1770_Lights

    状压,时间空间都不行,如果每次搜索一半就可以省下很多空间,用map记下每种状态的答案,最后再把两次的答案合并 然而正解是高斯消元解异或方程组,最后搜索自由元 #include<iostream& ...

  4. [Noip2004]虫食算 dfs

    搜索问题的关键:优秀的搜索策略以及行之有效的减枝 对于这道题我们阶乘搜肯定不行所以我们按位搜,我们对每一位的三个数进行赋值,然后判解. 对于此一类的搜索乘上一个几十的常数来减枝往往要比直接搜要快得多, ...

  5. P1092 虫食算[搜索]

    这个式子是是由\(A\sim A+N\)组成的,那么\(A\sim A+N\)就只能等于\(0\sim N-1\),因此我们每次对\(A\sim A+N\)的取值做一个新的排列,然后judge一下当前 ...

  6. VIJOS 1052贾老二算算术 (高斯消元)

    描述 贾老二是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面.虽然他解决 2x=2 这样的方程游刃有余,但是对于 {x+y=3 x-y=1} 这样的方程组就束手无策了.于 ...

  7. NOIP 2004 虫食算题解

    问题 E: [Noip2004]虫食算 时间限制: 1 Sec  内存限制: 128 MB 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一 ...

  8. 【算法】高斯消元&线性代数

    寒假作业~就把文章和题解3道题的代码扔在这里啦——链接: https://pan.baidu.com/s/1kWkGnxd 密码: bhh9 1.HNOI2013游走 #include <bit ...

  9. [NOIP2004] 提高组 洛谷P1092 虫食算

    题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...

随机推荐

  1. Java:String、StringBuffer、StringBuilder

    一.String 1. String类是final类,意味着String类不能被继承,它的成员方法都默认为final方法.在早期的JVM版本中,被final修饰的方法会转为内嵌调用来提升执行效率.从J ...

  2. ORB-SLAM(十)LoopClosing Sim3求解

    主要参考这篇论文 Horn B K P. Closed-form solution of absolute orientation using unit quaternions[J]. JOSA A, ...

  3. zedboard学习第一篇

    1. 刚开始学习使用,不知道从哪里开始,手上的资料也很乱,至于这个板子需要学什么也不清楚. 2. 第一个工程就从helloworld开始吧,Zed板上的Zynq是一个PS(processing sys ...

  4. 使用union

    QUERY: explain extended ) TRACE: { "steps": [ { "join_preparation": { "sele ...

  5. 使用redux-actions优化actions管理

    redux-actions的api很少,有三个createAction(s)  handleASction(s)   combineActions 主要用到createAction去统一管理actio ...

  6. 计蒜客蓝桥杯模拟赛 后缀字符串:STL_map+贪心

    问题描述 一天蒜头君得到 n 个字符串 si​,每个字符串的长度都不超过 10. 蒜头君在想,在这 n 个字符串中,以 si​ 为后缀的字符串有多少个呢? 输入格式 第一行输入一个整数 n. 接下来  ...

  7. gossip版本raft算法实现

    raft算法的实现概述 节点的启动和加入: 1. 第一个节点启动,发现没有其他的member节点,则自己变成master 2. 第二个节点启动并加入第一个节点,发现有member节点,并且master ...

  8. simhash和minhash实现理解

    文本相似度算法 minhash minhash 1. 把文档A分词形成分词向量L 2. 使用K个hash函数,然后每个hash将L里面的分词分别进行hash,然后得到K个被hash过的集合 3. 分别 ...

  9. STM32单片机是如何启动的?

    STM32单片机是如何启动的? STM32中的内存 STM32中的内存包含两块主要区域:flash memory(只读).static ram memory(SRAM,读写).其中,flash mem ...

  10. POJ 2104 K-th Number(划分树)

    Description You are working for Macrohard company in data structures department. After failing your ...