牛客小白月赛G (二分,字符串哈希)

https://ac.nowcoder.com/acm/contest/11228/G

  • 枚举删除的而后缀, 一共有两种情况有贡献:
  1. 剩余的前缀s是偶长度回文串ans+1,奇长度回文串ans+26
    2.s是只有一个位置不回文的回文串,ans+2
    查询n次判断回文可以用字符串哈希,难点在怎么处理第二种情况。
  • ①二分不同点x之外的长度
  • 判断x点到x在s中的对称点是否为回文串。
    image
#include<bits/stdc++.h>
//#include <bits/extc++.h>
using namespace std;
// using namespace __gnu_cxx;
// using namespace __gnu_pbds;
#define IOS ios::sync_with_stdio(false) ,cin.tie(0), cout.tie(0);  
//#pragma GCC optimize(3,"Ofast","inline")
#define ll long long
#define ull unsigned long long
#define li __int128_t
#define PII pair<int, int>
#define re register
//#define int long long
const int N = 1e6 + 5;
const int M = 1e6 + 5;
const int mod = 1e9 + 7;
const ll LNF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
struct str_hash {
    ull base = 131;
    ull p[N]; char s[N];
    ull mp[N];
    int n;
    void init( string &str ) {
        n = str.length();
        for ( int i = 1; i <= n; ++ i ) s[i] = str[i - 1];
        p[0] = 1;
        for ( int i = 1; i <= n; ++ i ) {
            mp[i] = mp[i - 1] * base + s[i];
            p[i] = p[i - 1] * base;
        }
    }
    ull hash ( ull l, ull r ) {
        return mp[r] - mp[l - 1] * p[r - l + 1];
    }
} nor, rev;

int main() {
    IOS
    int n; cin >> n;
    string ss; cin >> ss;
    nor.init(ss); reverse(ss.begin(), ss.end()); rev.init(ss);
    int ans = 0;
    for ( int i = 2; i <= n + 1; ++ i ) {
        int r = i - 1;
        if( nor.hash( 1, r ) == rev.hash( n - r + 1, n ) ) {
            if( r & 1 ) ans += 26; else ans += 1;
        } else {
            int lt = 0, rt = r;
            while( lt < rt ) {
                int mid = ( lt + rt + 1 ) >> 1;
                if( nor.hash(1, mid) == rev.hash( n - r + 1 , n - r + 1 + mid - 1 ) ) lt = mid;
                else rt = mid - 1;
            }
            int l = lt + 2;
            if( nor.hash( l, r - l + 1 ) == rev.hash( n - r + l, n - l + 1 ) ) {
                ans += 2;
            }
        }
    }
    cout << ans << "\n";
    return 0;
}
posted @ 2022-06-05 17:41  qingyanng  阅读(35)  评论(0编辑  收藏  举报