51Nod- 1347 旋轉字串
阿新 • • 發佈:2019-01-31
S[0…n-1]是一個長度為n的字串,定義旋轉函式Left(S)=S[1…n-1]+S[0].比如S=”abcd”,Left(S)=”bcda”.一個串是對串當且僅當這個串長度為偶數,前半段和後半段一樣。比如”abcabc”是對串,”aabbcc”則不是。
現在問題是給定一個字串,判斷他是否可以由一個對串旋轉任意次得到。
Input
第1行:給出一個字串(字串非空串,只包含小寫字母,長度不超過1000000)
Output對於每個測試用例,輸出結果佔一行,如果能,輸出YES,否則輸出NO。
Inputaa
ab
OutputYES
NO
題意有點暈,大意是把一個字串首尾相接後,如果可以找到一個位置,能令這個位置前後的字串相同,那麼他就是一個對串。例如“fghasdfghasd”從第四個a開始的“asdfgh”與其後的“asd”+“fgh”相同,則這是一個對串。
這樣的話,簡單的暴力求解。從串的中間位置開始查詢,直到末尾。
通過程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include<cstdio> #include<cstring> #include<iostream> using namespace std; char a[1000005]; int main() { while(cin >> a) { int len = strlen(a); if(len % 2 != 0) ///如果字元個數是奇數個則不滿足要求,返回NO; { cout << "NO" << endl; continue; } bool flag = false; ///立一個flag; for(int i = 0;i < len;i ++) { if(a[(i + len/2) % len] != a[i]) ///從串的中間開始比較,一旦不滿足條件就輸出NO並break; { cout << "NO" << endl; flag = true; ///不滿足條件,flag中了; break; } } if(flag){ continue; } ///如果flag為真則跳過後面的,否則執行輸出YES; cout << "YES" << endl; } } |