题意:给一句话S,包含n个单词,求与其相似的句子T的个数,包含自己。相似满足两个条件:①单词的多重集相同②一个单词在S中出现的第i个词在T中出现第i个词的索引相差不超过1。
思路:令 f[i] 为前 i 个单词组成的相似字符串的个数,可知规律:如果相邻两单词相同,则交换后不改变,则f[i+1]=f[i];
如果不相等,则交换,那么f[i] = f[i-1] + f[i-2];一直到f[n]时算出结果。
注意:另的f[0]=f[1]=1;避免数字太大记住取模。
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int N =1e5+10;
int f[N];
string S[N];
int main(){
int tcase;
cin>>tcase;
while(tcase--){
int n;
cin>>n;
f[0]=1;
f[1]=1;
for(int i=1;i<=n;i++){
cin>>S[i];
}
for(int i=2;i<=n;i++){
if(S[i]==S[i-1]){
f[i]=f[i-1];
}
else{
f[i] = (f[i-1] + f[i-2])%mod;
}
}
cout<<f[n]<<endl;
}
return 0;
}