博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hdu 1686 Oulipo (KMP)
阅读量:5287 次
发布时间:2019-06-14

本文共 1465 字,大约阅读时间需要 4 分钟。

题目链接:

  

题目描述:

  给出两个串,分别为a,b,问a串在b串中出现了几次?(其实位置不同,就算不同的串)

解题思路:

  字符串匹配首选KMP算法,刚开始的时候,每次匹配成功一个子串后,我就把母串中的指针指向匹配成功的子串起始位置加一处。无疑TLE,ORZ.jpg。

  最后想到如果子串很长的话并且出现的字符很单一,算法的复杂度就降为O(M*N)了,GG。其实把匹配到子串末位后,把当前的情况当做失配就好了,移动子串中的指针到对应的Next值处。

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 8 #define LL long long 9 #define maxn 1001010 #define mod 10000000711 12 char a[maxn*100], b[maxn];13 int Next[maxn], n, m;14 15 void Get_Next (char b[], int m)16 {17 int i, j;18 j = Next[0] = -1;19 i = 0;20 21 while (i < m)22 {23 while (j!=-1 && b[i]!=b[j])24 j = Next[j];25 26 Next[++ i] = ++ j;27 }28 }29 30 int kmp (char a[], char b[])31 {32 int ans, i, j;33 i = j = ans = 0;34 35 Get_Next (b, m);36 37 while (i < n)38 {39 while (j!=-1 &&a[i] != b[j])40 j = Next[j];41 42 j++, i++;43 44 if (j == m)45 {46 ans ++;47 j = Next[j];///匹配成功后,当做失配,移动j到Next处48 }49 }50 return ans;51 }52 53 int main ()54 {55 int T;56 scanf ("%d", &T);57 58 while (T --)59 {60 scanf ("%s %s", b, a);61 62 n = strlen (a);63 m = strlen (b);64 65 printf("%d\n", kmp(a, b));66 }67 return 0;68 }69

 

转载于:https://www.cnblogs.com/alihenaixiao/p/5417839.html

你可能感兴趣的文章
关于web服务器和数据库的各种说法(搜集到的)
查看>>
C# Stream 和 byte[] 之间的转换
查看>>
OMG: daily scrum nine
查看>>
redis与spring结合错误情况
查看>>
第六章 字节码执行方式--解释执行和JIT
查看>>
字符串方法title()、istitle()
查看>>
yield语句
查看>>
查看linux系统中占用cpu最高的语句
查看>>
[洛谷P1738]洛谷的文件夹
查看>>
ubuntu server设置时区和更新时间
查看>>
【京东咚咚架构演进】-- 好文收藏
查看>>
【HTML】网页中如何让DIV在网页滚动到特定位置时出现
查看>>
文件序列化
查看>>
Bootstrap--响应式导航条布局
查看>>
Learning Python 009 dict(字典)和 set
查看>>
JavaScript中随着鼠标拖拽而移动的块
查看>>
HDU 1021 一道水题
查看>>
The operation couldn’t be completed. (LaunchServicesError error 0.)
查看>>
php每天一题:strlen()与mb_strlen()的作用分别是什么
查看>>
工作中收集JSCRIPT代码之(下拉框篇)
查看>>