HDU3336 Count the string 一道KMP的巧解

简介: http://acm.hdu.edu.cn/showproblem.php?pid=3336 题目 这是喵呜大神用KMP做的,46MS  #include <stdio.h>#define MOD 10007char b[200005];int dp[200005];int p[200005];int n;int Pre(){ int s,i,

http://acm.hdu.edu.cn/showproblem.php?pid=3336 题目

这是喵呜大神用KMP做的,46MS 

#include <stdio.h>

#define MOD 10007

char b[200005];
int dp[200005];
int p[200005];
int n;

int Pre()
{
    int s,i,j;
    dp[0]=1;
    j=-1;
    p[0]=-1;
    s=1;
    for (i=1;i<n;i++)
    {
        while(j>=0 && b[j+1]!=b[i]) j=p[j];
        if (b[j+1]==b[i]) j++;
        if (j>=0) dp[i]=(dp[j]+1)%MOD;
        else dp[i]=1;
        p[i]=j;
        s=(s+dp[i])%MOD;
    }
    return s;
}

int main()
{
    int i,j,T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        scanf("%s",b);
        printf("%d\n",Pre());
    }
    return 0;
}


这是更优的,15MS

 
思路:
1、首先确定这个字符串的首字母,然后从第二个开始搜起 当遇到和首字
符一样的时候,就从该字母开始后面的字符继续和这个字符串的首 字符
后续的字符进行比较,直到出现不一样为止,此时相同的字符个数就
加到总数上。
2、然后继续 从首字符下一个字符开始, 和1步骤差不多,就是这个字
符和前面的字符一起往后比较,遇到不 一样又重复这个步骤。。。

#include <stdio.h>
char str[200005];
int main()
{
    int t,n,i,j,sum;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        sum=n;
        sum%=10007;
        scanf("%s",str);
        for(i=1;i<n;i++)
        {
            if(str[i]==str[0])
            {
                for(j=i;j<n;j++)
                {
                    if(str[j]!=str[j-i])
                        break;
                }
                sum+=j-i;
                sum%=10007;
            }
        }
        printf("%d/n",sum);
    }
    return 0;
}



目录
相关文章
hdu 3336 Count the string
点击打开链接hdu 3336 思路:kmp+next数组的应用 分析: 1 题目要求的是给定一个字符串s,求字符串s的所有的前缀在s的匹配的次数之和mod10007. 2 很明显n1,为什么要从n开始而不是1开始呢,这里因为是要求前缀的匹配数而不是后缀; 4 求sum的时候注意每一步都有可能超过范围,所以就要求一次sum同时取模一次。
837 1
|
11天前
|
Java UED
Java中String强转int:一种常见的错误和解决方法
在Java中将非数字字符串转换为整数会导致`NumberFormatException`。要解决这个问题,可以使用`try-catch`捕获异常,正则表达式验证数字格式,或利用异常信息提供错误提示。例如,`Integer.parseInt()`会因遇到非数字字符如`&quot;123abc&quot;`而抛出异常,但通过异常处理或正则`\\d+`可确保安全转换。记得在编程时避免直接强转,以防止程序异常中断。
|
2天前
|
安全 Java
Java基础之StringBuffer
【7月更文挑战第1天】 Java中的`StringBuffer`是线程安全的字符串操作类,适合多线程环境,而`StringBuilder`非线程安全,速度更快,适用于单线程。两者提供`append()`、`insert()`、`delete()`等方法修改字符串,避免了频繁创建新对象的性能问题。在不需要线程安全时,推荐使用`StringBuilder`以提高效率。
8 1
|
3天前
|
安全 Java 索引
带你快速掌握Java中的String类和StringBuffer类(详解常用方法 | 区别 )
带你快速掌握Java中的String类和StringBuffer类(详解常用方法 | 区别 )
|
1月前
|
Java 安全 索引
滚雪球学Java(48):面向对象编程中的StringBuffer类详解
【6月更文挑战第2天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
32 5
滚雪球学Java(48):面向对象编程中的StringBuffer类详解
|
10天前
|
Java 数据处理 Apache
探讨Java中判断String类型为空和null的方法
探讨Java中判断String类型为空和null的方法
12 1
|
1月前
|
存储 Java 测试技术
滚雪球学Java(47):String类教程:如何在Java中使用字符串操作
【6月更文挑战第1天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
25 2
滚雪球学Java(47):String类教程:如何在Java中使用字符串操作
|
12天前
|
Java API 索引
java中String类常用API
java中String类常用API
|
6天前
|
存储 Java API
Java基础之String类
Java的String类是引用类型,用于创建和操作字符串。字符串对象在`java.lang`包中,不可变。创建方式包括字面量和`new`关键字。字符串池存储字符串常量,避免重复。比较字符串用`equals()`(区分大小写)和`equalsIgnoreCase()`(不区分大小写)。`length()`返回长度,`concat()`或`+`拼接,`substring()`截取,`indexOf()`和`lastIndexOf()`查找,`replace()`替换,`split()`分割。这些是常用的字符串API。
8 0
|
6天前
|
Java
Java基础之String类
Java基础之String类
9 0