题意:uva的题,每道都是有背景的orz,都是阅读理解
题解:暴力模拟,拿着短的那个串,对着长的一格一格往左滑,每滑一格暴力扫一遍。然后再从头往右滑,我这里wa了三发,wa了后习惯性瞎改,改到后来循环都改错了。
shortest solution 用while循环ij当指针,还写了个函数处理左右滑。
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<iostream> #include<queue> #include<set> #include<vector> #include<string> using namespace std; typedef long long ll; #define rep(i,t,n) for(int i =(t);i<=(n);++i) #define per(i,n,t) for(int i =(n);i>=(t);--i) #define mmm(a,b) memset(a,b,sizeof(a)) string s1, s2; int main() { while (cin >> s1 >> s2) { int len1 = s1.length(), len2 = s2.length(); if (len1 < len2)swap(s1, s2); len1 = s1.length(), len2 = s2.length(); rep(i, 1, len2)s1.push_back('0'); int ans = 205; rep(i, 0, len1) { int ok = 1; rep(j, 0, len2 - 1) { if (s2[j] + s1[i + j] - '0' - '0' <= 3)continue; else { ok = 0; break; } } if (ok == 1) { ans =max( i + len2,len1); break; } } rep(i, 1, len2)s1 = '0' + s1; rep(i, 0, len2 - 1) { int ok = 1; rep(j, i, len2 - 1) { if (s2[j] + s1[len2+j-i] - '0' - '0' <= 3)continue; else { ok = 0; break; } } if (ok == 1) { ans = min(ans, len1 + i); break; } } ans = min(ans, len1 + len2); cout << ans<<endl; } return 0; } /* 22222 21111 */