/*
给你两个字符串t和p
要求从t中找到一个和p相同的连续子串
并输出该子串第一个字符的下标
输入描述
输入文件包括两行 分别表示字符串t和p
保证t的长度不小于p
且t的长度不超过1000000
p的长度不超过10000
输出描述
如果能从t中找到一个和p相等的连续子串,
则输出该子串第一个字符在t中的下标
下标从左到右依次为1,2,3,…;
如果不能则输出 “No”
如果含有多个这样的子串
则输出第一个字符下标最小的
示例一:
输入:
AVERDXIVYERDIAN
RDXI
输出
4
*/
#include<iostream>
#include<stdlib.h>
#include<stack>
#include<vector>
#include<stdio.h>
#include<string>
using namespace std;
#if 1
void Get_next(char *next, string &str)
{
int j = 0, i = 1;
for (; i < str.size(); i++)
{
if (j>0&&str[i] != str[j]) {
j = next[j - 1];
}
else if (str[i] == str[j])
{
j++;
}
next[i] = j;
}
}
int main()
{
string str;
string son_str;
cin >> str;
cin >> son_str;
char next[10000] = { 0 };
Get_next(next, son_str);
int j = 0;
for (int i = 0; i < str.size(); i++)
{
if (j > 0 && str[i] != son_str[j])
{
j = next[j - 1];
}
else if (str[i] == son_str[j])
{
j++;
}
if (j >= son_str.size()) {
cout << i - son_str.size()+2 << endl;
break;
}
}
if (j < son_str.size()) {
cout << "NO" << endl;
}
return 0;
}