1451.字符串的移动
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submissions: 14 (6 users) Accepted: 2 (2 users) [ My Solution ]
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; }