大家好,又见面了,我是你们的朋友全栈君。
s: “abab”
The prefixes are: “a”, “ab”, “aba”, “abab”
For each prefix, we can count the times it matches in s. So we can see that prefix “a” matches twice, “ab” matches twice too, “aba” matches once, and “abab” matches once. Now you are asked to calculate the sum of the match times for all the prefixes. For “abab”, it is 2 + 2 + 1 + 1 = 6.
The answer may be very large, so output the answer mod 10007.
For each case, the first line is an integer n (1 <= n <= 200000), which is the length of string s. A line follows giving the string s. The characters in the strings are all lower-case letters.
1 4 abab
6
给你一个字符串算这里面所有前缀出现的次数和。比如字符串abab,a出现2次,ab出现2次,aba出现1次,abab出现1次。
-
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int Next[200010],dp[200010]; //dp[i]=以第i个字符结尾的串中所有前缀的计数和
char str1[200010];
void GetNext(int len,char *s)
{
Next[1]=0;
int i=1;
int j=0;
dp[0]=0;
while (i<=len)
{
if(j==0 || s[i]==s[j])
{
dp[i]=(dp[j]+1)%10007;
i++;
j++;
if(s[i]==s[j])
Next[i]=Next[j];
else
Next[i]=j;
}
else
j=Next[j];
}
}
int main()
{
int t,n,ans;
scanf(“%d”,&t);
while (t–)
{
ans=0;
scanf(“%d”,&n);
getchar();
scanf(“%s”,str1+1);
GetNext(n,str1);
for (int i=1; i<=n; i++)
{
ans=(ans+dp[i])%10007;
}
printf(“%d\n”,ans);
}
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163382.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...