CSU-1598 最长公共前缀
2017-03-26 22:42
211 查看
题面:
给定两个字符串s和t,现有一个扫描器,从s的最左边开始向右扫描,每次扫描到一个t就把这一段删除,输出能发现t的个数。Input
第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个字符串s,第二行一个字符串t,字符串长度不超过1000000。
Output
对于每组数据,输出答案。
Sample Input
2
ababab
ab
ababab
ba
Sample Output
3
2
思路:
看数据范围,朴素匹配(暴力搜)肯定超时。所以用到KMP匹配。使用时注意下标的变化。代码:
#include<bits/stdc++.h> #define MAX 1000000 using namespace std; char str[MAX],t[MAX]; int T,Next[MAX];//由于iostream里有next,所以数组要改名(CE三发T_T) void get_next(char *s,int len) { int i=0,j=-1; Next[0]=-1; while(i<len) { if(j==-1||s[i]==s[j]){ ++i; ++j; Next[i]=j; }else j=Next[j]; } } int KMP(char *s,char *t,int ls,int lt) { int i=0,j=0,ans=0; while(i<ls) { if(j==-1||s[i]==t[j]){ ++i; ++j; }else j=Next[j]; if(j==lt){//区别在于找到一个匹配字符串之后不返回,继续查找之后的情况 ans++; j=Next[j]; } } return ans; } int main() { cin>>T; while(T--) { memset(Next,0,sizeof(Next)); cin>>str>>t; int ls=strlen(str); int lt=strlen(t); get_next(t,lt); int cnt; cnt=KMP(str,t,ls,lt); cout<<cnt<<endl; } return 0; }
相关文章推荐
- CSU 1598 最长公共前缀
- 后缀数组 CSU - 1598 最长公共前缀
- CSU 1598 最长公共前缀 【KMP】
- CSU 1598 最长公共前缀 KMP连续匹配
- CSU 1632 最长公共前缀(出现超过两次的不同子串有多少个)
- CSU1632Repeated Substrings(后缀数组/最长公共前缀)
- lintcode python ——最长公共前缀(LCP)
- CSU 1120 病毒(dp最长公共序列)
- 最长公共前缀(LCP)
- hdu1403 求最长公共前缀 后缀数组
- 病毒 CSU - 1120 最长公共上升子序列
- 14.一组字符串的最长公共前缀
- 最长公共前缀
- Lintcode(6)-最长公共前缀
- 动态建树之——寻找最长公共前缀
- HDU 2594 Simpsons’ Hidden Talents (KMP——前缀后缀最长公共串)
- 求最长公共前缀和后缀—基于KMP的next数组
- LeetCode14最长公共前缀
- 14.最长公共前缀
- LeetCode 14 Longest Common Prefix(最长公共前缀)