[HNUOJ1145] Isomorphic Inversion(字符串哈希)

传送门:Isomorphic Inversion

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e6+6;
string s;
int len;
ull h[maxn], p[maxn];

void init()
{
    h[0] = 0;
    for(int i = 1; i <= len; ++i)
        h[i] = h[i-1]*131 + s[i]-'0' + 1;
    p[0] = 1;
    for(int i = 1; i <= len; ++i)
        p[i] = p[i-1] * 131;
}

void read()
{
    cin >> s;
    len = s.length();
    s = " " + s;
}
        
void solve()
{
    int leftStart = 1, leftEnd = 1;
    int rightStart = len, rightEnd = len;
    int ans = 0;
    while(leftEnd <= rightStart)
    {
        ull hashVal1 = h[leftEnd] - h[leftStart-1]*p[leftEnd-leftStart+1];
        ull hashVal2 = h[rightEnd] - h[rightStart-1]*p[rightEnd-rightStart+1];
        while(hashVal1 != hashVal2) 
        {
            ++leftEnd;
            --rightStart;
            if(leftEnd >= rightStart)
                break;
            
            hashVal1 = h[leftEnd] - h[leftStart-1]*p[leftEnd-leftStart+1];
            hashVal2 = h[rightEnd] - h[rightStart-1]*p[rightEnd-rightStart+1];
        }

        if(hashVal1 != hashVal2)
        {
            ++ans;
            break;
        }
        else
        {
            if(leftEnd != rightStart)
                ans += 2;
            else
                ++ans;
            leftStart = ++leftEnd;
            rightEnd = --rightStart;
        }
    }
    cout << ans << endl;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    read();
    init();
    solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/HNUCSEE_LJK/article/details/100588632