Codeforces Round #607 (Div. 2) C - Cut and Paste(构造+规律)

在这里插入图片描述
在这里插入图片描述
题意:给定一个字符串s和一个整数x,现在规定每一部做3件事情,一、移动光标l;二、将【l,len(此时字符串长度)】剪切;三、复制s[l]次到s后面,如此反复做x次。看样例应该能看明白。
思路:字符串长度应该还是很好求地,公式为:len=i+s[i]*(len-i);可是这个公式地前是你得知道s[i]是多少,否则没法求,所以可以先把字符串长度【1,x】地字符先求出来,然后套公式就行了,(一开始很怕求字符地时候复杂度会超,但仔细想想应该不会)。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int mod=1e9+7;
char s[maxn];
typedef long long ll;
int main()
{
	int T;
	ll x,ans;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld",&x);
		scanf("%s",s+1);
		int len=strlen(s+1);
		string str=(s+1);
		for(int i=0;str.size()<x;++i)//构造【1,x】的字符,我这里i从0开始的,所以后面要i+1
		{
			int j=1,k=str[i]-'0';
			string temp=str.substr(i+1,str.size()-i+1);
			while(j<k)
			{
				j++;
				str+=temp;
			}
		}
		ll ans=len;
		for(int i=0;i<x;++i)
		ans=(i+1+(str[i]-'0')*(ans-i-1)%mod+mod)%mod;
		printf("%lld\n",ans%mod);
	}
}
发布了39 篇原创文章 · 获赞 0 · 访问量 1064

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104083535