A - next[i]
Problem Description
在字符串匹配的KMP算法中有一个重要的概念是next数组,求解它的过程让不少同学伤透了心。next数组的直接语义其实是:使“长度为L的前缀”与“长度为L的后缀”相同的最大L,且满足条件的前后缀不能是原字符串本身。
例如对字符串"ababa"来说,长度为1的前缀与后缀都是"a",它们相同;长度为2的前缀与后缀分别是"ab"和"ba",它们不相同;长度为3的前缀与后缀都是"aba",它们相同;长度为4的前缀与后缀分别是"abab"和"baba",它们不相同。因此对字符串"ababa"来说,使“长度为L的前缀”与“长度为L的后缀”相同的最大L是3。
现在我们把这个最大的L值称为原字符串S的next值。在此概念的基础上,对给定的字符串S,下标为从1到N,那么next[i]就是指子串S[1…i]的next值。
现在给定一个字符串,下标从1到N,然后给一个下标i,求next[i]。
Input
每个输入文件一组数据。
只有一行,输入一个仅由小写字母组成的长度为N(1<=N<=100)的字符串、与一个下标i(1<=i<=N)。
Output
一个整数,即next[i]。
Sample Input 1
ababa 5
Sample Output 1
3
Sample Input 2
ababab 4
Sample Output 2
2
Sample Input 3
ab 2
Sample Output 3
0
分析:掌握具体算法即可,算法详解见KMP算法
#include<bits/stdc++.h>
using namespace std;
void buildNext(string str, int nt[]){
int len = str.size();
nt[0] = -1;
int t = nt[0], j = 0;
while(j < len - 1){
if(t < 0 || str[j] == str[t]){
nt[++j] = ++t;
}else{
t = nt[t];
}
}
}
int main(){
int nt[110];
string str;
cin>>str;
buildNext(str, nt);
int index;
cin>>index;
cout<<nt[index - 1] + 1<<endl;
return 0;
}
B - 链表重排
Problem Description