zoukankan      html  css  js  c++  java
  • 1451.字符串的移动

    1451.字符串的移动
    Time Limit: 1000 MS         Memory Limit: 65536 K
    Total Submissions: 14 (6 users)         Accepted: 2 (2 users) [ My Solution ]
    Description

    给定非空字符串S和正整数k, 我们定义函数Shift(S, k)表示将字符串S循环右移k位, 例如Shift("abc", 1) = "cab", Shift("abc", 2) = "bca", 现在给你两个长度相同的非空字符串S和T, 你需要找到一个小于两个字符串长度的正整数k, 满足Shift(S, k) = T。

    Input

    输入有2行, 分别为字符串S 和 T (1 <= |S| = |T| <= 100,000), 输入保证两个字符串中的字符都只由小写字母构成。

    Output

    若不存在满足题意的k则输出-1, 否则输出任意一个满足题意的k都可以通过本题。

    Sample Input

    abcab

    ababc

    Sample Output

    2

    Hint

    这是一道SPECIAL JUDGE的题目

    Source
    xmu
     
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    const int maxn=100010;
    
    char s1[maxn*2],s2[maxn];
    int next[maxn],flag,ans;
    
    void getnext(int len){
        int i=0,j=-1;
        next[0]=-1;
        while(i<len){
            if(j==-1 || s2[i]==s2[j]){
                i++;j++;
                if(s2[i]==s2[j])
                    next[i]=next[j];
                else
                    next[i]=j;
            }else
                j=next[j];
        }
    }
    
    void KMP(int len1,int len2){
        getnext(len2);
        int i=0,j=0;
        while(i<len1){
            if(j==-1 || s1[i]==s2[j]){
                i++;j++;
            }else
                j=next[j];
            if(j==len2){
                flag=1;
                ans=i;
                break;
            }
        }
    }
    
    int main(){
    
        //freopen("input.txt","r",stdin);
    
        int len1,len2;
        while(cin>>s1>>s2){
            len1=strlen(s1);
            len2=strlen(s2);
            if(len1!=len2){
                cout<<"-1"<<endl;
                continue;
            }
            for(int i=0;i<len1;i++)
                s1[len1+i]=s1[i];
            flag=0;
            KMP(2*len1,len2);
            if(flag)
                cout<<(2*len1-ans)%len1<<endl;
            else
                cout<<"-1"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    最长上升子序列问题
    多重部分和问题 (dp)
    01背包问题的延伸即变形 (dp)
    完全背包问题入门 (dp)
    最长公共子序列问题
    01背包入门 dp
    POJ 30253 Fence Repair (二叉树+优先队列)
    POJ 3069 Saruman's Army (模拟)
    [leetcode-357-Count Numbers with Unique Digits]
    [leetcode-474-Ones and Zeroes]
  • 原文地址:https://www.cnblogs.com/jackge/p/2963259.html
Copyright © 2011-2022 走看看