[TIOJ] 1489 核心字串

link:http://tioj.infor.org/problems/1489
  啊啊啊!甚麼咚咚啊@@,一直看錯題看錯題,而且我還是通宵來寫的,結果好生氣><(雖然問題大部分出在我身上),不過我還真的看不懂第一個核心字串原來是指長度最小的那個@@,看了別人的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';
    }
}

留言

這個網誌中的熱門文章

Shellshock.io從入門到上手(針對單狙)(沒有圖片、影片版本)

[TIOJ] 1007燈泡問題