分析:
一个标记刚开始指向第一个位置,,然后从第二个开始遍历,遍历到的每个字符和标记指向的字符进行比较,如果一样,则这个标记就向后移动一个,因为从这两个位置开始就有了相同的字符串,前面的已经相同,只需要比后面是不是一样,往后比就行,如果还是相同,前面的标记继续向后移动,遍历的指针也指向下一个。如果不一样,则那个标记重新回到第一个位置
然后题目说的可分解字符串的个数,我们只需要新开一个数组b[]
,这个太抽象了 我解释不出来,看代码吧
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <string>
using namespace std;
typedef long long ll;
int main()
{
int n;
cin >> n;
while (n--)
{
string s;
int l , sum = 1, j = 0;
cin >> l;
int b[200005] = {0};
b[0] = 1;
cin >> s;
for (int i = 1; i < l; i++)
{
if (s[i] == s[j])
{
b[i] = b[i - 1];
if (s[i] == s[0])
b[i]++;
j++;
}
else if (s[i] == s[0])
{
b[i] = 2;
j = 1;
}
else
{
b[i] = 1;
j = 0;
}
sum = (b[i] + sum) % 10007;
}
cout << sum << endl;
}
return 0;
}