File tree Expand file tree Collapse file tree 2 files changed +114
-7
lines changed Expand file tree Collapse file tree 2 files changed +114
-7
lines changed Original file line number Diff line number Diff line change 11#include < iostream>
2- #include < string>
3-
2+ #include < string.h>
3+ #include < algorithm>
4+ #include < vector>
45using namespace std ;
56
6-
77int 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}
Original file line number Diff line number Diff line change 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+ */
You can’t perform that action at this time.
0 commit comments