[TIOJ] 1489 核心字串
link:http://tioj.infor.org/problems/1489
啊啊啊!甚麼咚咚啊@@,一直看錯題看錯題,而且我還是通宵來寫的,結果好生氣><(雖然問題大部分出在我身上),不過我還真的看不懂第一個核心字串原來是指長度最小的那個@@,看了別人的code後才終於知道了,但也順便學了一下別人的作法了XD
而且看錯題以為是找相同前後綴的時候還看懂了KMP演算法的failure function!
要判斷是不是核心字串很簡單,就測過26字母就可以了,但找最短的時候,就必須使用到爬行法,一次增加右邊一個,再看看左邊可以砍掉幾個,若最後長度較小就更新。
啊啊啊!甚麼咚咚啊@@,一直看錯題看錯題,而且我還是通宵來寫的,結果好生氣><(雖然問題大部分出在我身上),不過我還真的看不懂第一個核心字串原來是指長度最小的那個@@,看了別人的code後才終於知道了,但也順便學了一下別人的作法了XD
而且看錯題以為是找相同前後綴的時候還看懂了KMP演算法的failure function!
要判斷是不是核心字串很簡單,就測過26字母就可以了,但找最短的時候,就必須使用到爬行法,一次增加右邊一個,再看看左邊可以砍掉幾個,若最後長度較小就更新。
#include<bits/stdc++.h> using namespace std; int n; string a; int main() { ios_base::sync_with_stdio(0); cin.tie(0); while(cin >> n,n) { cin >> a; int used[30] = {}; int cnt = 26; int i; for(i = 0; i < a.length() && cnt > 0; i++) { if(used[a[i]-'a'] == 0) cnt--; used[a[i]-'a']++; } if(i == a.length() && cnt != 0) { cout << "not found" << '\n'; continue; } int len = i; int l = 0, r = i-1; for(int front = 0; i < a.length(); i++) { used[a[i]-'a']++; for(;used[a[front]-'a'] > 1;front++) used[a[front]-'a']--; if(len > i-front+1) { len = i-front+1; l = front; r = i; } } cout << a.substr(l,len) << '\n'; } }
留言
張貼留言