题解 P2187 【小Z的笔记】
[
Description
题目链接:Luogu 2187
小 Z 的有一个长度为
数据范围:
Solution
我们可以很容易地写出朴素的
显然整个转移方程的复杂度为
时间复杂度:
Code
#include <cstdio>
#include <algorithm>
const int N=1e5+5;
int n,f[N],g[30];
char s[N];
bool e[30][30];
char getc() {
char c=getchar();
while(c<'a'||c>'z') c=getchar();
return c;
}
int main() {
scanf("%d%s",&n,s+1);
int m;
for(scanf("%d",&m);m--;) {
int u=getc()-'a',v=getc()-'a';
e[u][v]=e[v][u]=1;
}
for(int i=1;i<=n;++i) {
f[i]=1<<30;
for(int j=0;j<26;++j) if(!e[s[i]-'a'][j]) f[i]=std::min(f[i],g[j]+i-1);
g[s[i]-'a']=std::min(g[s[i]-'a'],f[i]-i);
}
printf("%d\n",f[n]);
return 0;
}