日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenJudge NOI 1.7 30:字符环

發布時間:2025/3/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenJudge NOI 1.7 30:字符环 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目鏈接】

OpenJudge NOI 1.7 30:字符環

【題目考點】

1. 字符串

2. 環形數組遍歷

環形數組元素個數為n,下標為0~n-1,在環形數組中下標i取下一個位置的方法:i = (i + 1) % n
環形數組中下標i后第j個位置的下標為:(i + j) % n

3. 環形數組轉一維數組

一個環形數組有n個元素。如想遍歷該環形數組,同時取一段子數組做某種運算,而該子數組的長度小于等于2n,那么就可以將該環形數組變為一個長為2n的一維數組,將環形數組中的元素在一維數組上排列兩遍,而后在該一維數組上做遍歷。

例:在環形數組上找最大子段和
假設環形數組為:4 -4 2 -3 5 -3
轉為一維數組:4 -4 2 -3 5 -3 4 -4 2 -3 5 -3
其最大子段和為5-3+4=6

【解題思路】

解法1:在環形數組上遍歷

輸入兩個字符串到s1和s2,其長度分別為l1、l2。i1與i2分別為s1與s2的下標,i1從0遍歷到l1-1, i2從0遍歷到l2-1。對于每對i1, i2,看s1從i1開始,與s2從i2開始,相同的子串最長可以是多長。在這一過程中,需要使用在環形數組中取下一個位置的寫法,即形如i = (i + 1) % n的寫法。對每次取到的子串長度取最大值,即為結果。

解法2:環形數組轉為一維數組

將兩個環形字符串轉為一維字符串(方法見題目考點3),而后就是兩個一般字符串找最長公共子串的問題了,做法與解法1相似,遍歷時下標直接加1即可。

【題解代碼】

解法1:在環形數組上遍歷

#include<bits/stdc++.h> using namespace std; #define N 260 int main() {char s1[N], s2[N];int i1 = 0, i2 = 0, l1, l2, mxLen = 0;//i1, i2分別是s1, s2的下標 mxLen:最大公共子串長度 cin >> s1 >> s2;l1 = strlen(s1);l2 = strlen(s2);for(int i1 = 0; i1 < l1; ++i1)for(int i2 = 0; i2 < l2; ++i2){int j = 0;//j為公共子串長度,最長也就是l1和l2的較小值 while(j < l1 && j < l2){if(s1[(i1+j)%l1] == s2[(i2+j)%l2])//在環形數組s1中i1后第j個元素下標為(i1+j)%l1,s2中i2后第j個元素下標為(i2+j)%l2 j++;elsebreak;}mxLen = max(mxLen, j);}cout << mxLen;return 0; }

解法2:環形數組轉為一維數組

#include<bits/stdc++.h> using namespace std; #define N 260 void doubleArr(char s[])//將s變為原來的s重復2遍 如將abc變為abcabc {int len = strlen(s);for(int i = 0; i <= len; ++i)s[i+len] = s[i]; } int main() {char s1[N], s2[N];int i1 = 0, i2 = 0, l1, l2, mxLen = 0;//i1, i2分別是s1, s2的下標 mxLen:最大公共子串長度 cin >> s1 >> s2;l1 = strlen(s1);l2 = strlen(s2);doubleArr(s1);//將字符串變為原字符串重復2遍,即為用一維數組表示環形數組 doubleArr(s2);for(int i1 = 0; i1 < l1; ++i1)for(int i2 = 0; i2 < l2; ++i2){int j = 0;//j為公共子串長度,最長也就是l1和l2的較小值 while(j < l1 && j < l2){if(s1[i1+j] == s2[i2+j])j++;elsebreak;}mxLen = max(mxLen, j);}cout << mxLen;return 0; }

總結

以上是生活随笔為你收集整理的OpenJudge NOI 1.7 30:字符环的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。