codeforces1203A關於循環移位的問題,字符串匹配

題意:n個數字組成的排列,問它們能不能通過循環移位形成1 2 3...n的序列或者是n...3 2 1 的序列。

比如2 3 4  5 1 和3 2 1 4 就可以,但是1 2 3 5  4 就不行。題的鏈接

對於這種問題可以兩個for循環從前往後,再從後往前,直接暴力找,找到了一個就行,沒有就不行。但是這樣要考慮很多東西。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
#include<climits>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cfloat>
using namespace std;
int main()
{
    int T,i,j,a[205],flag,k,t,n,temp;
    scanf("%d",&T);
    while(T--)
    {
        flag=0;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        i=1;
        while(i<=n)
        {
            j=i;
            for(k=1;k<n;k++)
            {
                if(j==n)t=1; 
                else t=j+1;
                if(a[t]!=(a[j]+1))
                {
                   // cout<<t<<" "<<j<<endl;
                    break;
                }
                if(j==n)j=1;
                else j++;
            }
            if(k==n)
            {
                flag=1;
                break;
            }
            j=i;
            for(k=1;k<n;k++)
            {
                if(j==1)t=n;
                else t=j-1;
                if(a[t]!=(a[j]+1))
                break;
                if(j==1)j=n;
                else j--;
            }
            if(k==n)
            {
                flag=1;
                break;
            }
            i++;
        }
        if(flag)cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}

可以直接將序列複製兩遍或者一遍,成爲一個新的序列。然後在這個新的序列裏,找是否出現過1...n或者n...1的序列。

 

字符串的題也是一樣

如果要判斷一個字符通過循環移位是不是包含了另一個子串,就把它複製兩遍,然後寫個KMP

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章