#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;
}
[HNUOJ1145] Isomorphic Inversion(字符串哈希)
猜你喜欢
转载自blog.csdn.net/HNUCSEE_LJK/article/details/100588632
今日推荐
周排行