#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define N 100005
char str[N];
int nex[N];
int dp[N];
int n;
void getNext(char *p)
{
int j,k;
nex[0]=-1;
j=0;
k=-1;
int len=strlen(p);
while(j<len)
{
if(k==-1||p[j]==p[k]) //匹配的情况下,p[j]==p[k]
{
j++;
k++;
nex[j]=k;
}
else //p[j]!=p[k]
k=nex[k];
}
}
int KMPMatch(char *s,char *p)
{
int i,j;
i=0;
j=0;
getNext(p);
int len=strlen(s);
int len2=strlen(p);
while(i<len)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
{
j=nex[j]; //消除了指针i的回溯
}
if(j==len2)
return i-len2;
}
return -1;
}
int main()
{
while(scanf("%s",str)!=EOF)
{
int i;
n=strlen(str);
getNext(str);
int ans=0;
for(i=1;i<=n;i++)
{
dp[i]=dp[nex[i]]%256;
dp[i]=(dp[i]+1)%256;
ans=(ans+dp[i])%256;
}
printf("%d\n",ans);
}
return 0;
}
hdu 4552(KMP+DP)
最新推荐文章于 2022-04-01 22:26:40 发布