1. 程式人生 > >牛客練習賽17 B-好位置

牛客練習賽17 B-好位置

AI 差分 int 數據 lan AR max code names

傳送門

題意:本來慣例中文題不解釋的, 但是有些人不懂這個題意, 簡單的來說, 就是s1每一個的每一個字符都可以和別的字符構成一個子串 == s2。 算了還是慣例中文題意不解釋吧。

題解:其實以前寫nowcoder的比賽的時候,已經被nowcoder的數據給震驚過了,可是昨天發現有人交隨機數過的,有人交Java套數據過的,汗,然後中午被某人催了寫一下這個題目。

其實很簡單,對於s1, 我們從開頭匹配出最先的s2子串,並且對應的位置記錄下L[i], 在從末尾開始匹配出最後的s2子串,並且記錄下對應的位置R[i]。 其中i表示為s2的第i個字符。

   然後對於第i個字符c來說, 所有位置在 L[i] 和 R[i] 之間的 c 都是合法的, 因為 我們可以取 L[i]的前半部分子串, 加上c, 並且加上 R[i]的後半部分子串 就可以構成 s2的串了。

   然後稍微貪省力一下,就差分標記一下就好了。

最後遍歷一下s1的所有位置, 看一下是否合法就好了。

代碼:

技術分享圖片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
 4 #define LL long long
 5 #define ULL unsigned LL
 6 #define fi first
 7 #define se second
 8
#define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define max3(a,b,c) max(a,max(b,c)) 12 #define min3(a,b,c) min(a,min(b,c)) 13 typedef pair<int,int> pll; 14 const int INF = 0x3f3f3f3f; 15 const LL mod = 1e9+7; 16 const int N = 2e5+10; 17 char s1[N]; 18 char
s2[N]; 19 int L[N], R[N]; 20 int sum[N][26]; 21 int main(){ 22 ///Fopen; 23 scanf("%s%s", s1, s2); 24 int len1 = strlen(s1), len2 = strlen(s2); 25 int j = -1, id ; 26 for(int i = 0; i < len2; i++){ 27 j++; 28 while(j < len1 && s1[j] != s2[i]) j++; 29 if(j == len1) {puts("No"); return 0;} 30 id = s2[i] - a; 31 sum[j][id]++; 32 } 33 j = len1; 34 for(int i = len2-1; i >= 0; i--){ 35 j--; 36 while(j >= 0 && s1[j] != s2[i]) j--; 37 if(j == -1) {puts("No"); return 0;} 38 id = s2[i] - a; 39 sum[j+1][id]--; 40 } 41 for(int i = 1; i < len1; i++) 42 for(int j = 0; j < 26; j++) 43 sum[i][j] += sum[i-1][j]; 44 for(int i = 0; i < len1; i++){ 45 id = s1[i] - a; 46 if(!sum[i][id]){puts("No"); return 0;} 47 } 48 puts("Yes"); 49 return 0; 50 }
View Code

    

牛客練習賽17 B-好位置