Skip to content

Commit 7d03fbf

Browse files
author
lazylzg
committed
Merge branch 'master' into LiZhiguo
2 parents d0d0580 + 9d2bf21 commit 7d03fbf

File tree

2 files changed

+114
-7
lines changed

2 files changed

+114
-7
lines changed
Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,46 @@
11
#include<iostream>
2-
#include<string>
3-
2+
#include<string.h>
3+
#include<algorithm>
4+
#include<vector>
45
using namespace std;
56

6-
77
int main(){
8-
string str1,str2;
9-
cin>>str1;
10-
cin>>str2;
8+
string s1, s2;
9+
cin>>s1>>s2;
10+
string s1_left = s1.substr(0, s1.find('.')); // 分割整数和小数部分
11+
string s1_right = s1.substr(s1.find('.')+1);
12+
string s2_left = s2.substr(0, s2.find('.'));
13+
string s2_right = s2.substr(s2.find('.')+1);
1114

12-
return 0;
15+
if(s1_left.length() < s2_left.length()) //s1_left永远是最长的
16+
s1_left.swap(s2_left);
17+
if(s1_right.length() < s2_right.length()) //s1_right永远是最长的
18+
s1_right.swap(s2_right);
19+
// cout<<s1_left<<" "<<s2_left<<endl;
20+
int f = 0; //记录进位数字
21+
for(int i=s2_right.length()-1;i>=0;i--){ // 小数部分加法
22+
int a=s1_right[i]-'0'+s2_right[i]-'0'+f; // 对应位相加,注意从最短数的最后一位相加
23+
s1_right[i] = a%10+'0'; //将数字变成字符
24+
f = a/10;
25+
}
26+
27+
int len = s1_left.length()-1; // 整数部分加法
28+
for(int i=s2_left.length()-1;i>=0;i--){
29+
int a=s1_left[len]-'0'+s2_left[i]-'0'+f; // 对应位相加,注意从最短数的最后一位相加
30+
s1_left[len] = a%10+'0'; //将数字变成字符
31+
f = a/10;
32+
len--;
33+
}
34+
35+
while(len>=0){ // 最长整数部分剩余位
36+
int a = s1_left[len]-'0'+f;
37+
s1_left[len] = a%10+'0';
38+
f = a/10;
39+
len--;
40+
}
41+
if(len<0 && f==1){ // 处理 5.3+5.9 这样的情况
42+
s1_left.insert(0, "1");
43+
}
44+
cout<<s1_left<<"."<<s1_right<<endl;
45+
return 0;
1346
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#include<iostream>
2+
#include<algorithm>
3+
#include<string>
4+
using namespace std;
5+
6+
const int MAXN = 1000000;
7+
const int MAXM = 10000;
8+
9+
int text[MAXN];
10+
int pattern[MAXM];
11+
int nextTable[MAXM];
12+
13+
void GetNextTable(int m){ // 创建next表
14+
int i = 0, j = -1;
15+
nextTable[0] = -1;
16+
while (i < m) { //因为找前后缀的匹配,所以让j=-1,使得第一个模式串从i=1开始
17+
if(j == -1 || pattern[i] == pattern[j]){
18+
i++;
19+
j++;
20+
nextTable[i] = j;
21+
}else {
22+
j = nextTable[j];
23+
}
24+
}
25+
}
26+
27+
int KMP(int n, int m){
28+
GetNextTable(m);
29+
int i = 0, j = 0;
30+
while(i < n && j < m){ // n是目标字符串,m是模式串
31+
if(j == -1 || text[i] == pattern[j]){ //匹配成功,
32+
i++; //或者是j==-1, 首部匹配失败,直接文本串向后移动一位
33+
j++;
34+
}else{ //匹配失败, 根据next数组移动模式串的j, 保持文本串的i不回溯,
35+
j = nextTable[j];
36+
}
37+
/* 把开头不匹配的情况单独拿出来
38+
if(text[i] == pattern[j]){
39+
i++;
40+
j++;
41+
}else if(j == 0 && text[i] != pattern[j]){
42+
i++;
43+
}else {
44+
j = nextTable[j];
45+
}*/
46+
}
47+
if(j == m){ //移动到边界,匹配成功
48+
return i - j + 1;
49+
}else {
50+
return -1;
51+
}
52+
}
53+
54+
int main(){
55+
int caseNumber;
56+
cin>>caseNumber;
57+
while(caseNumber--){
58+
int n, m;
59+
cin>>n>>m;
60+
for(int i=0;i<n;i++){
61+
cin>>text[i];
62+
}
63+
for(int j=0;j<m;j++){
64+
cin>>pattern[j];
65+
}
66+
cout<<KMP(n, m)<<endl;
67+
}
68+
return 0;
69+
}
70+
71+
/*KMP理解
72+
https://blog.csdn.net/v_JULY_v/article/details/7041827
73+
https://www.zhihu.com/question/21923021
74+
*/

0 commit comments

Comments
 (0)