luooj1559最強陣容加強版

題目鏈接
分析
用最小表示法返回最小表示串(字典序最小的同構串)第一個字符在原始串中的下標。
用兩個指針i,j,i初始化爲0,j初始化爲1,用k表示當前已經匹配串的長度。如果str[i+k]==str[j+k],j++,否則如果str[i+k]>str[j+k],說明以i開始的同構串肯定不是最小的,並且以i開始的到以i+k開始的都不會是最小的,因爲若以i+x開頭,0<=x<=k,那麼這時以j+x開頭的串比這個串小,因爲前面相等,比較到i+k和j+k發現str[j+k]小,因此就把i移到i+k+1。同理如果str[i+k]>str[j+k],把j移到j+k+1,如果i==j,j++。直到i,j,k中有一個大於等於串的長度爲止。最後返回i和j裏較小的那個,注意破鏈成環的問題,代碼並沒有處理。
代碼

#include<bits/stdc++.h>
using namespace std;
char a[300005];
int slove(char *s, int l){  
    int i=0,j=1,k=0,x,y;  
    while(i<l&&j<l&&k<l){  
        if((i+k)>=l) x=i+k-l; else x=i+k;
        if((j+k)>=l) y=j+k-l; else y=j+k;
        if(s[x]==s[y]) k++;  
        else{  
            if(s[x]>s[y]) i=i+k+1;else j=j+k+1;  
            if(i==j) j++;
            k=0;  
        }  
    }  
  return (i<j?i:j);  
}
int main(){
  int n;
  scanf("%d",&n);
  for(int i=0;i<n;i++){
        getchar();
        char c;
        scanf("%c",&c);
        a[i]=c;
    }
  cout<<slove(a,n)+1<<endl;
  return 0;
}
發佈了59 篇原創文章 · 獲贊 8 · 訪問量 7624
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章