您的位置:首页 > 其它

HDU 3336

2014-04-30 18:36 288 查看

思路:KMP,但要对其进行变形,当找到失败位置时,要继续考察该位置,一直向前找到字符串首不能再向前找,因为我们不只要计算该子串本身,我们还要计算该子串包含的其他子串,因为这些子串都是原串的子串,这是显然的。

#include<stdio.h>
#include<string.h>
int fail[200005];
int sum[200005];
char str[200005];
int T, m, max;
void getfail()
{
fail[0] = -1;
int i, j, temp;
for(i = 1, j = -1; i < m; i ++)
{
while(j >= 0 && str[j + 1] != str[i])
{
j = fail[j];
}
if(str[j + 1] == str[i])
j ++;
fail[i] = j;
if(j >= 0)
{
sum[j] ++;
if(max < j)
max = j;
temp = j;
while(temp >= 0)
{
temp = fail[temp];
sum[temp] ++;
}
}
}
}
int main(int argc, char const *argv[])
{
int i, cnt;
scanf("%d", &T);
while(T--)
{
memset(str, 0, sizeof(str));
memset(sum, 0, sizeof(sum));
scanf("%d", &m);
cnt = m % 10007;
max = 0;
getchar();
fgets(str, m+1,stdin);
getfail();
for(i = 0; i <= max; i ++)
{
/* printf("OK\n"); */
sum[i] %= 10007;
cnt += sum[i];
cnt %= 10007;
}
printf("%d\n", cnt);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: