• SDUT F - 判断回文串


    F - 判断回文串

    线段树去维护字符串前缀哈希,基础的字符串哈希是在一整段哈希中截取一部分哈希,但线段树的维护恰好将其反转过来,是维护区间哈希,通过一种 与字符串哈希获取某一段哈希 相反的方法将其维护上去。

    这里贴一个写题的时候绷不住的笑话,N0和No是两个东西。Wa了N发才找到问题

    ACcode 

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. //#define int long long
    12. #define endl '\n'
    13. #define lowbit(x) (x &-x)
    14. #define mh(x) memset(x, -1, sizeof h)
    15. #define debug(x) cerr << #x << "=" << x << endl;
    16. #define brk exit(0);
    17. using namespace std;
    18. void TLE(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);}
    19. const int N = 2e5 + 10;
    20. const int M = 2 * N;
    21. const int mod = 998244353;
    22. const double esp = 1e-6;
    23. const double pi = acos(-1);
    24. typedef pair<int, int> PII;
    25. typedef long long ll;
    26. int pp[N];
    27. struct node
    28. {
    29. int hl, hr;
    30. }t[N<<2];
    31. string s;
    32. void pushup(node& p, node &p1, node &p2, int l, int r)
    33. {
    34. p.hl = p1.hl + p2.hl * pp[l];
    35. p.hr = p1.hr * pp[r] + p2.hr;
    36. }
    37. void build(int p, int l, int r)
    38. {
    39. if (l == r)
    40. {
    41. t[p].hl = t[p].hr = s[l];
    42. return;
    43. }
    44. int mid = l + r >> 1;
    45. build(p << 1, l, mid);
    46. build(p << 1 | 1, mid + 1, r);
    47. pushup(t[p],t[p<<1],t[p<<1|1],mid-l+1,r-mid);
    48. }
    49. void modify(int p, int l, int r,int pos,char x)
    50. {
    51. if (l == r)
    52. {
    53. t[p].hl = t[p].hr = x;
    54. return;
    55. }
    56. int mid = l + r >> 1;
    57. if (pos <= mid)modify(p << 1, l, mid, pos, x);
    58. else modify(p << 1 | 1, mid + 1, r, pos, x);
    59. pushup(t[p],t[p<<1],t[p<<1|1],mid-l+1,r-mid);
    60. }
    61. node query(int p, int l, int r, int ll, int rr)
    62. {
    63. if (l >= ll && r <= rr)
    64. {
    65. return t[p];
    66. }
    67. int f1 = 0, f2 = 0;
    68. int mid = l + r >> 1;
    69. node res1, res2, ans;
    70. if (mid >= ll)res1 = query(p << 1, l, mid, ll, rr), f1 = 1;
    71. if (mid < rr)res2 = query(p << 1 | 1, mid + 1, r, ll, rr), f2 = 1;
    72. if (f1 && f2)
    73. pushup(ans, res1, res2, (mid - max(l, ll) + 1), (min(r, rr) - mid));
    74. else if (f1)
    75. ans= res1;
    76. else if (f2)
    77. ans = res2;
    78. return ans;
    79. }
    80. signed main()
    81. {
    82. TLE();
    83. int n, m;
    84. cin >> n >> m;
    85. cin >> s;
    86. s = '0' + s;
    87. pp[0] = 1;
    88. for (int i = 1;i <= n;i++)
    89. pp[i] = pp[i - 1] * 137;
    90. build(1, 1, n);
    91. while(m--)
    92. {
    93. int op;
    94. cin >> op;
    95. if (op == 1)
    96. {
    97. int pos;char x;
    98. cin >> pos >> x;
    99. modify(1, 1, n, pos, x);
    100. }
    101. else if (op == 2)
    102. {
    103. int l, r;
    104. cin >> l >> r;
    105. node res = query(1, 1, n, l, r);
    106. if (res.hl == res.hr)
    107. cout << "Yes" << endl;
    108. else cout << "N0" << endl;
    109. }
    110. }
    111. return 0;
    112. }

     

  • 相关阅读:
    计算机毕业设计之java+springboot基于vue的广场舞团社团网站-社团管理系统
    7.6 分组的背包问题7.7 有依赖的背包问题7.8 泛化物品
    View 自定义 - 属性 xml
    leetcode995. K 连续位的最小翻转次数
    LeetCode 40. Combination Sum II【回溯,剪枝】中等
    数据结构——顺序表和链表
    CGAL 入门基础
    标准误与聚类稳健标准误的理解
    rust注释
    JAVA城市湖泊信息管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  • 原文地址:https://blog.csdn.net/Bookerbobo/article/details/126712263