NC237272. 计算题
描述
输入描述
第一行输入一个数字,代表字符串的长度,。
第二行输入一行字符串。
输出描述
一个整数。
示例1
输入:
3 abc
输出:
30
说明:
对于删除后缀长度为的情况,我们只能修改第一个字符为,或者修改第三个字符为,种字符串。示例2
输入:
3 aba
输出:
54
说明:
对于删除后缀长度为的情况,我们可以修改成的方式,总共有种字符串C++ 解法, 执行用时: 177ms, 内存消耗: 24852K, 提交时间: 2022-06-04 01:26:09
#include<bits/stdc++.h> using namespace std; unsigned long long ha1[1000005],ha2[1000005],pw[1000005],base=1e9+7; char R[1000005]; int cal(int st1,int st2,int len) { int l=1,r=len,mid,ans=0; while(l<=r) { mid=(l+r)>>1; if(ha1[st1+mid]-ha1[st1]*pw[mid]==ha2[st2-mid]-ha2[st2]*pw[mid])l=mid+1; else ans=mid,r=mid-1; } return st1+ans; } int main() { int i,n,x,y,ans=0; scanf("%d%s",&n,R+1); assert(n>=1&&n<=1e6); for(pw[0]=i=1;i<=n;i++) { assert(R[i]>='a'&&R[i]<='z'); ha1[i]=ha1[i-1]*base+R[i]; ha2[n-i+1]=ha2[n-i+2]*base+R[n-i+1]; pw[i]=pw[i-1]*base; } for(i=1;i<=n;i++) { if(ha1[i]-ha1[0]*pw[i]==ha2[1]-ha2[i+1]*pw[i]) { if(i&1)ans+=26; else ans++; continue; } x=cal(0,i+1,i); y=cal(x,i+1-x,i-x); if(y==cal(y,i+1-y,i-y))ans+=2; } printf("%d\n",ans); return 0; }