C. Canine poetry
题意:为了救出自己的爱人,丈夫必须要使三头恶犬沉睡。三头恶犬不喜欢回文字符串,丈夫可以对自己原有的字符串进行修改,使他不包含回文字符串。
一个大字符串是由许多个小的回文串组成,两种情况xx或xyx;
因为尾部的字符能和后面的字符匹配,可能成为回文串,所以我们优先改尾部的字符。
#include <bits/stdc++.h>
using namespace std;
int t;
string s;
int main()
{
cin >> t;
while (t -- )
{
cin >> s;
int cnt = 0;
for (int i = 0; i < s.size(); i ++ )
{
if (s[i] == '#') continue;
if (s[i] == s[i + 1] && i + 1 < s.size())
{
cnt ++;
s[i + 1] = '#';
}
if (s[i] == s[i + 2] && i + 2 < s.size())
{
cnt ++;
s[i + 2] = '#';
}
}
cout << cnt << endl;
}
return 0;
}
KMP打卡
#include <bits/stdc++.h>
using namespace std;
const int N = 100010, M = 1000010;
int n, m;
int ne[N];
char s[M], p[N];
int main()
{
cin >> n >> p + 1 >> m >> s + 1;
for (int i = 2, j = 0; i <= n; i ++ )
{
while (j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j ++;
ne[i] = j;
}
for (int i = 1, j = 0; i <= m; i ++ )
{
while (j && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j ++;
if (j == n)
{
printf("%d ", i - n);
j = ne[j];
}
}
return 0;
}