链接
\(\text{Luogu-P3375 KMP字符串匹配}\)
题意
输入两个串\(s_1、s_2\),求出\(s_2\)在\(s_1\)中所有出现的位置(匹配的开始位置),并输出子串的\(next\)数组的;
数据范围:\(s_1\)长度为\(n\),\(s_2\)长度为\(M\),\(n\leq 1000000,m\leq 1000000\).
分析
这是一个\(kmp\)的模板题;
这里我用了\(Java\)来写,然而一直TLE,不知什么原因,最后发现了原因,在于String的使用;
在\(ACM\)竞赛中需要特别注意Java中String及与其有关的一些函数;String是一个不可变的对象,每次对String进行修改时都等同于生成了一个新的String临时对象,如果需要经常对其修改,那么这是相当浪费时间的;
在此题中,我使用了一个String.format()函数来控制格式的输出,这个函数会返回一个String,而我又在for里反复使用了它,所以会TLE;我试了仅仅使用String.format()输出了一个元素,是不会超时的,所以仅仅是\(O(1)\)的使用它是不会超时的。
代码
1 | import java.io.*; |