题目:自然的谜语

题目描述

题目描述
给出两个字符串 S1、S2,判断 S1 在 S2 中出现了多少次,并输出每次出现的偏移量。

数据规模
对于 50% 的数据,S1 和 S2 的长度均小于 100。
对于 100% 的数据,S1 和 S2 的长度均小于 100000,且 S1 的长度不超过 S2 的长度。

输入格式

两个,分别为字符串 S1 和 S2。

输出格式

如果 S1 没有在 S2 中出现,则输出“There must be something wrong.”(注意大小写,符号为半角,建议直接复制)。
如果 S1 在 S2 中出现了,则第一行输出一个数为 S1 在 S2 中出现的次数 n,后跟 n 行,分别为这 n 次出现的偏移量(即 S1 首字母对应于 S2 中的位置)。

题解:

原装KMP(串匹配)问题,需要多看,多复习

代码实现:

View Code
 1 #include<iostream>
2 #include<string>
3 using namespace std;
4
5 string s1,s2;int n,pi[100001],b[100001],ans=0;
6
7 int main()
8 {
9 int i,j,k;int q;
10 cin>>s1>>s2;
11
12 pi[0]=-1;
13 k=-1;
14 for(q=1;q<s1.size();q++)
15 {
16 while(k>-1&&s1[k+1]!=s1[q])
17 k=pi[k];
18 if(s1[k+1]==s1[q])
19 k++;
20 pi[q]=k;
21 }
22
23 k=-1;
24 for(i=0;i<s2.size();i++)
25 {
26 while(k>-1&&s1[k+1]!=s2[i])
27 k=pi[k];
28 if(s1[k+1]==s2[i])
29 k++;
30 if(k==s1.size()-1) {ans++;b[ans]=i-s1.size()+2;k=pi[k];}
31 }
32
33 if(ans==0) {cout<<"There must be something wrong.";return 0;}
34 cout<<ans<<endl;
35 for(i=1;i<=ans;i++)
36 cout<<b[i]<<endl;
37 system("pause");
38 return 0;
39
40 }
41
42
原文地址:https://www.cnblogs.com/noip/p/2331470.html