这个题仔细想想,应该不难发现和kmp有关。
遍历一遍,Next数组大于1(不管Next的大小,它只是代表前缀和后缀的最大相同长度)的时候,说明前面有前缀和后面的相同,加上2,(本身就已经出现一次了,0位置的出现次数,在n加上去。)
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#include<queue>
#include<map>
using namespace std;
char s[1000005],re[1000005];
long long Next[1000005],n;
void getnext()
{
long long i=0,j=-1;
Next[0]=-1;
while(i<n)
{
if(j==-1||re[i]==re[j])
{
i++;
j++;
//if(re[i]==re[j])
//Next[i]=Next[j];不能加上这两句
//因为要求字符串每个前缀
Next[i]=j;
}
else j=Next[j];
}
}
int main()
{
long long C,i,j,sum,L;
scanf("%lld",&C);