#46302: c++ write up 那個測資有點好笑記得改


s11131151@nhsh.tp.edu.tw (cc)

學校 : 臺北市立內湖高級中學
編號 : 221040
來源 : [111.125.132.37]
最後登入時間 :
2025-07-15 12:42:21

 
附上的程式需要改正後才能使用,請細心閱讀註釋
 
 
第一步進行切片,直接去數他的子字串
int k; cin >> k;
string a; cin >> a;
ios::sync_with_stdio(0);
cin.tie(0);
vector<int>c;
int tmp = 1; // tmp 存子字串相同的 
for(int i=1;i<a.size()-1;i++)
{
if ((isupper(a[i]) == isupper(a[i+1])) || (islower(a[i]) ==islower(a[i+1]))) tmp++;
else 
{
c.push_back(tmp);
tmp = 1;
}
 
}
c.push_back(tmp);
第二步 判斷剛剛切片的東西 
int ans = 0;
tmp = -1; //記錄用的起點
for(int i = 0; i < c.size(); i++) 
{
   
if(c[i] == k)
{
if(tmp == -1) tmp = i; //  第一次遇到k 
//如果 tmp !=-1那代表已經在區間繼續走下去了 
}
else
{
if(tmp!=-1)
{
int len = i - tmp; // 區間長度 
 
//判斷左右擴張 
if(tmp > 0 && c[tmp - 1] >k) len++; // 向左擴張
if (i <c.size() && c[i] > k) len++; // 向右擴張
 
//刷新答案
ans = max(ans, len); 
 
//重置 找下一區間
tmp = -1; 
}
}
 
}
第三步 收尾最後搞一下
if (tmp != -1) 
{
    int len = c.size() - tmp;
    if (tmp > 0 && c[tmp - 1] > k) len++;
    if(c.back() > k) len++;
    ans = max(ans, len);
}
最後一步 列印
    //ans 只有紀錄幾段而已,而每一段都是k個字 
    cout << ans*k;