1. 程式人生 > >51Nod- 1347 旋轉字串

51Nod- 1347 旋轉字串

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。 

Input 
aa 

ab 

Output
YES 

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;
    }
}
謝謝瀏覽。